ertttert
Books-CMS.clan.su

Внешний вход

Иногда использовать локальную таблицу Drupal users не требуется. Например, возможно, таблица с данными о пользователях уже имеется в другой базе данных или в LDAP. Среда Drupal позволяет легко интегрировать внешнюю аутентификацию в процесс входной регистрации.

Сейчас мы реализуем очень простой модуль внешней аутентификации, чтобы продемонстрировать работу внешней аутентификации. Предположим, что в вашей компании принимаются на работу только люди по имени Дэйв (Dave), а пользовательские имена назначаются на основе имени и фамилии. Этот модуль аутентифицирует любого с пользовательским именем, начинающимся на dave, т.е. пользователи davebrown, davesmith и davejones успешно выполнят вход. Мы воспользуемся функцией form_alter() для изменения обработчика проверки входа пользователя, чтобы выполнять собственный обработчик проверки. Вот содержимое файла sites/all/modules/custom/authdave/authdave.info:

name = Authenticate Daves
description = External authentication for all Daves.
package = Pro Drupal Development
core = 7.x
files[] = authdave.module

А вот сам модуль authdave.module:

<?php
/**
* Реализация hook_form_alter().
* Заменяем локальный обработчик входной проверки нашим обработчиком.
*/

function authdave_form_alter(&$form, &$form_state, $form_id) {
 // В данном простом примере выполняется аутентификация по имени
 // пользователя — проверяем, начинается ли оно на dave.
 if ($form_id == 'user_login' || $form_id == 'user_login_block') {
   $form['#validate'][] = 'authdave_user_form_validate';
 }
}

/**
* Специальная функция проверки формы.
*/
function authdave_user_form_validate($form, &$form_state) {
 if (!authdave_authenticate($form_state)) {
   form_set_error('name', t('Unrecognized username.'));
 // Пользовательское имя не распознано.
 }
}

/**
* Специальная функция аутентификации пользователя.
*/
function authdave_authenticate($form_state) {
 // Извлечение первых четырех символов пользовательского имени.
 $username = $form_state['input']['name'];
 $testname = drupal_substr(drupal_strtolower($username),0,4);
 // Проверка, зовут ли пользователя dave.
 if ($testname == "dave") {
 // Если это Dave, вызывается функция external_login_register —
 // либо для входа, либо для создания новой учетной записи,
 // если тот, кто вошел, еще не является пользователем Drupal.
 user_external_login_register($username, 'authdave');
 return TRUE;
 } else {
 return FALSE;
}
}
drupal drupal

В модуле authdave (рис. 6.5) мы просто заменяем второй обработчик проверки собственным обработчиком. Сравните рис. 6.5 с рис. 6.3, где показан процесс локальной входной регистрации пользователя.

Функция user_external_login_register() — вспомогательная функция, которая регистрирует пользователя, если это его первый вход, а затем выполняет его вход. Схема выполнения приведена на рис. 6.6 для гипотетического пользователя davejones, который вошел впервые.

Если имя пользователя начинается на dave, и это первый вход пользователя, т.е. в таблице users нет строки для этого пользователя, такая строка создается. Однако при этом не заносится адрес электронной почты, как при стандартной локальной регистрации пользователя, поэтому такой простой модуль не является приемлемым решением, если для работы сайта необходима рассылка почтовых сообщений пользователям. Тогда все-таки придется заполнить столбец mail в таблице users, а для этого нужно, чтобы модуль реагировал на операцию insert в хуке пользователя, который выполняется при вставке нового пользователя:

/**
* Реализация hook_user().
*/

function authdave_user_insert(&$edit, &$account, $category = NULL) {
 global $authdave_authenticated;
 if ($authdave_authenticated) {
 $email = mycompany_email_lookup($account->name);
 // Занесение адреса электронной почты для этого
 // пользователя в таблицу users.
 db_update('users')
 ->fields(
 array(
 'mail' => $email,
 )
 )
 ->condition('uid', $account->uid)
 ->execute();
 }
}

Внимательные читатели заметят, что код не может распознать, когда выполняется локальная, а когда внешняя аутентификации, поэтому мы предусмотрительно завели глобальную переменную, означающую, что наш модуль выполнил аутентификацию. Кроме того, можно выполнить запрос к таблице authmap:

db_query("SELECT uid FROM {authmap} WHERE uid = :uid AND module = :module",
array(':uid' => $account->uid, 'module' => 'authdave');

Для всех пользователей, добавленных с помощью внешней аутентификации, будет присутствовать строка как в таблице authmap, так и в таблице users. Однако в данном случае аутентификация и hook_user_insert выполняются во время одного и того же запроса, так что глобальная переменная является хорошей альтернативой запросу к базе данных.

Всего комментариев: 0
Имя *:
Email *:
Код *:


Бесплатный конструктор сайтов - uCoz