УрокДобавляем авторизацию по емейлу в Drupal 7

Я был несколько огорчён, узнав, что в семёрке я не имею возможности авторизоваться как по логину, так и по емейлу пользователя. Решения этой проблемы ровненько два.

Решение первое

Модуль Email registration. Поставив его вы получите требуемый функционал. Однако в дополнение вы получите дополнительный багаж из функционала модуля (регистрация по емейлу, вместо обычной). Если вас это устраивает - дальше можно не читать.

Решение второе

Создаём свой маленький модуль (или даже в template.php темы можно). Там на поле с именем пользователя при логине довешиваем дополнительный валидатор, который проверяет, не емейл ли введён в это поле. Если емейл - то получаем имя пользователя по емейлу, а дальше авторизация идёт по обычному механизму.

/**
 * Implements hook_form_alter().
 */
function ИМЯМОДУЛЯ_form_alter(&$form, &$form_state, $form_id) {
  // Навешиваем валидатор как для блока логина, так и для формы на странице /user.
  if (stripos($form_id, 'user_login') !== FALSE) {
    $form['name']['#element_validate'][] = '_ИМЯМОДУЛЯ_user_login_validate';
  }
}
 
/**
 * Form element validation handler for the user login form.
 * Allows users to authenticate by email.
 */
function _ИМЯМОДУЛЯ_user_login_validate($form, &$form_state) {
  if (isset($form_state['values']['name'])) {
    if ($name = db_query('SELECT name FROM {users} WHERE mail = :name', array(':name' => $form_state['values']['name']))->fetchField()) {
      $form_state['values']['name'] = $name;
    }
  }
}

После этого логин будет работать в штатном режиме, только теперь он будет пропускать и емейл.

Комментарии

Аватар пользователя kalabro
kalabro написала:

Ну, LoginToboggan ещё. Всякие настройки длины пароля, мгновенная авторизация после регистрации с правами not-approved юзера интеграция с Rules и другие полезные вещи

26.04.2012 21:02
Аватар пользователя Spleshka
Spleshka написал:

Судя по описанию, он позволяет авторизоваться по логину ИЛИ по емейлу. А в моём случае - и по тому и по другому. Но за ссылку спасибо, модуль полезный.

26.04.2012 21:32
Аватар пользователя kalabro
kalabro написала:

SplasH, союз И у меня вызывает представление, что нужно ввести и имя пользователя, и его email ;) Так что и у LT, и у вас одинаковый функционал ИЛИ в данном случае.

Кстати, и вы, и LT используете db_query. Из экономии?

27.04.2012 12:00
Аватар пользователя Spleshka
Spleshka написал:

Да, действительно, ваша правда. Видимо, магнитные бури навалились на меня вчера =)

По поводу db_query() - я обычно пользуюсь db_select(), но просто я этот запрос выдрал из одного модуля, а переписывать не было необходимости.

27.04.2012 14:05
Аватар пользователя Tsan
Tsan написал:

Эм запутался в Ваших ответах. Я так понял ЛТ дает возможность авторизация по Логину + емаил так?
А модуль SplasH дает выбор авторизации либо по Логину либо по емаил?

31.07.2012 12:01
Аватар пользователя Витаий
Витаий написал:

Спасибо, отличное решение.

17.09.2012 11:27
Аватар пользователя respective
respective написал:

Не работает с Ajax Login/Register выдает такую ошибку:
Cannot redeclare ajax_register_form_alter() (previously declared in /.../sites/all/modules/ajax_register/ajax_register.module:167)
Впрочем, возможно я что-то не так делаю...

02.06.2013 10:58
Аватар пользователя Денис
Денис написал:

Здравствуйте!

Мне надо было регить юзера и сразу авторизовывать при переходе на сайт на конкретную ноду (типа входной страницы с внешнего сайта). В урле методом ПОСТ передается емаил - вот по этому емаилу я регистрирую юзера и сразу же его авторизую.
Получилось так:
(код набрал с разных источников, поэтому он не оптимальный еще и не "причесан". Дальше я буду его доделывать "под себя", поэтому здесь привожу как решение описанной задачи)

<?php
  global $user;
  if ($user->uid == 0) {
      //Создадим пользователя (имя и пароль будут генерироваться случайно)
 
  $pass_gen='1111111111'; // здесь функция генерации пароля должна быть
  $email_gen='test8@test123.ru'; //у меня емаил юзера будет передаватсья в урле методом ПОСТ
 
  // Регистрация юзера (имя юзера у меня равно емаилу для простоты)
  $arguments = array(
    'name' => $email_gen,
    'pass' => $pass_gen,
    'mail' => $email_gen,
    'init' => $email_gen,
    'status' => 1,
    'roles' => array(DRUPAL_AUTHENTICATED_RID => TRUE),
  );
 
  user_save( NULL, $arguments ); 
 
  // авторизация юзера:
  function druwebru_authenticate_programmatically($email_gen, $pass_gen) {
 
    // Пытаемся авторизоваться:
    if (user_authenticate($email_gen, $pass_gen)) :
        $user_object = user_load_by_name($email_gen);
        $form_state = array();
        $form_state['uid'] = $user_object->uid;
        user_login_submit(array(), $form_state);
        return true;
    else :
        return false;
    endif;
  }
 
  /* Пример использования: */
  if (druwebru_authenticate_programmatically($email_gen, $pass_gen))
    print "Вы вошли на сайт!";
  else
    print "Не удалось войти на сайт.";
 
} else {
echo "Вы уже авторизованы как юзер: ".$user->uid;
}
 
?>

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

28.01.2014 08:40
Аватар пользователя Денис
Денис написал:

Вот только пока не знаю как сделать проверку существования емаила поумному... Подскажите плиз..

28.01.2014 08:41
Аватар пользователя Михаил
Михаил написал:

Для того чтобы избежать лишнего запроса к базе, я бы добавил

if (strpos($form_state['values']['name'], '@') != FALSE)

Это, конечно, совершенно несущественно, но если заниматься оптимизацией, то надо стараться оптимизировать все что можно :)

20.04.2014 23:54
Аватар пользователя Виталий
Виталий написал:

Засунул код в template.php темы Dark Elegant. Не работает. В чем может быть проблема? Drupal 7

25.10.2014 22:52
Аватар пользователя Chewits
Chewits написал:

Не хотели бы сделать официальный проект на drupal.org? очень полезный не перегруженный модуль получился бы и люди помогли бы с багфиксами и т.п.

18.08.2015 12:05

Комментировать