Регистрация с проверкой в таблице другой БД? Сделали!

Главные вкладки

Аватар пользователя Nick Fedchik Nick Fedchik 28 декабря 2007 в 15:28

Есть некая таблица с пользователями (ранее зарегистрировавшимися, но в совсем другой системе)

Мне надо сделать так, чтобы в мой Дрюпал регистрировались только те юзеры, юзернеймы которых уже есть в этой таблице,
причем естественно проверка должна осуществляться автоматичски (вариант с авторизацией через админа не катит).
Штатные модули хачить не хочется в плане сопровождения и обновления.

Буду рад помощи или подсказке подходящих модулей.

Комментарии

Аватар пользователя gradP gradP 28 декабря 2007 в 15:45

А тот сайт на друпале?
Если да то в друпале уже реализована подобная функция.
/admin/settings/distributed-authentication

Аватар пользователя Nick Fedchik Nick Fedchik 28 декабря 2007 в 15:52

Спасибо. Сейчас посмотрю.
Но похоже мне такой наворот не надо, у меня проще - есть таблица, в ней поле с логинами
Мне надо позволить регистрироваться только тем новым юзерам, которые есть в этой таблице.

Я навскидку два варианта вижу - хачить модуль юзерс, или хачить другой подходящий модуль.

Аватар пользователя Nick Fedchik Nick Fedchik 28 декабря 2007 в 19:11

А можно чуть подробнее?
Я взялся перехачить простенький модуль username_check.module, но он используется только для проверки...
Я объявил в конфиге Дрюпала две базы - родную как default ну и внешнюю,
затем переписал sql-запрос на нужное мне поле, и поменял местами результаты true/false
Вот что получилось:
<?php
/**
* Main AJAX function: originality checking menu callback.
*/
function username_check_menu_isunique() {
$output = array();

$username = check_plain($_GET['username']);
$user = username_check_exists($username);

// $output['username'] = $username;
if (is_array($user) && !empty($user)) {
$output['exists'] = true;
$output['msg'] = t('user %username is valid.', array('%username' => $username));
} else {
$output['exists'] = false;
$output['msg'] = t('Unfortunatly, user %username is not valid!', array('%username' => $username));
}

username_check_set_header_nocache();

print drupal_to_js($output);
exit();
}

/**
* Query user table to check if such username is already exists.
*/
function username_check_exists($username) {
$rval = array();
db_set_active('remote);
$rval = db_fetch_array(db_query("SELECT * FROM users WHERE UserID = '%s'", $username));
db_set_active('default');
return $rval;
}
?>

Но это всего лишь проверка на корректность (на наличие в таблице),
а мне надо ЗАПРЕТИТЬ регистрироваться пользователю, которого нет в другой таблице на удаленном хосте.
ТАблица юзеров совсем не дрюпаловская.

Подскажи плиз ещё, что доделать в этом модуле username_check, чтоб добиться отказа в регистрации при моём условии?

Аватар пользователя Nick Fedchik Nick Fedchik 28 декабря 2007 в 20:57

Уже ближе и теплее... в мой перехаченый модуль я добавил такой код:

<?php
function username_check_user($op, &$edit, &$account, $category = NULL) {

if ($op == 'validate') {

$username = check_plain($_GET['username']);
//$username = trim(variable_get('username',''));
// Only do the checking if the codes variable is set.
if (strlen($username)) {
if (($category == 'account') && (!$account->uid)) {
if ( username_check_exists($username) == '' ) { // I'm not sure here... no skills in php
form_set_error('username', t('Invalid Name'));
watchdog('username', t('User entered invalid name: ".$edit['username'], WATCHDOG_WARNING);
}
}
} // if 'validate'
}
}
?>

Но блин - не выходит каменный цветок... Sad
Выходит что я не отлавливаю евент клика на сабмит кнопки создания юзера...

Аватар пользователя Nick Fedchik Nick Fedchik 28 декабря 2007 в 21:22

Стал копать глюбже - в core-модуль user
Нашел фрагмент:
<?php
/**
* Implementation of hook_user().
*/
function user_user($type, &$edit, &$user, $category = NULL) {
...

if ($type == 'validate' && $category == 'account') {
return _user_edit_validate(arg(1), $edit);
}
...
?>

и из него
<?php
function _user_edit_validate($uid, &$edit) {
$user = user_load(array('uid' => $uid));
// Validate the username:
if (user_access('change own username') || user_access('administer users') || arg(1) == 'register') {
if ($error = user_validate_name($edit['name'])) {
form_set_error('name', $error);
}
else if (db_num_rows(db_query("SELECT uid FROM {users} WHERE uid != %d AND LOWER(name) = LOWER('%s')", $uid, $edit['name'])) > 0) {
form_set_error('name', t('The name %name is already taken.', array('%name' => $edit['name'])));
}
else if (drupal_is_denied('user', $edit['name'])) {
form_set_error('name', t('The name %name has been denied access.', array('%name' => $edit['name'])));
}
}
?>
Догнал, что для отлупа регистрации мне надо вызвать
form_set_error('name', $error);

Вот ещё предполагаю что надо наверное прицепиться к
arg(1) == 'register'
но как - пока ещё не раскопал...

Или не понимаю, почему мой хук не хукается...
<?php
function username_check_user($op, &$edit, &$account, $category = NULL) {

if ($op == 'validate' && $category == 'account') {

form_set_error('name', t('TEST Invalid Key ID'));
watchdog('name', t('TEST User entered invalid Key Identifier: '.$edit['username'], WATCHDOG_WARNING);
...
?>

Аватар пользователя Nick Fedchik Nick Fedchik 30 декабря 2007 в 13:57

Да, хук вызывается... прищлось конечно с моей неопытностью в пхп и в Дрюпале в часности провозиться, но...
Мне удалось переделать под себя этот модуль username_check! Smile В итоге я добился следующего функционала:
1) Юзер при регистрации может ввести имя, и нажать на кнопку ПРОВЕРИТЬ
при этом через несколько секунд он увидит ответ - правильное у него имя или нет

2) Если юзер не проверил имя, или же проигнорировал его некорректность,
то он получит отказ в регистрации с уведомлением (стандартно - красный блок).

Что не сделано - кнопка находится сразу снизу под collapsible block, а хочется её поместить рядом возле поля ввода имени юзера.
Ответ как это сделать я надеюсь получить из модуля check_password_strength

Что важно - т.к. модуль определяет свои пути к колбэкам, то надо в ходе разработки, после внесения изменений в адреса колбэков, запускать update.php
Я на этом протупил пару-тройку часов Smile

edhel - спасибо!