Как я программно регистрирую пользователя?

Я ищу API, который позволит мне войти в систему, передав ему имя пользователя и пароль. Кто-нибудь имеет опыт с этим?

Чтобы уточнить, я пытаюсь создать окно входа в AJAX, которое появляется как всплывающее окно на главной странице, и не обновлять страницу в случае неправильных учетных данных, но только если журнал выполнен правильно. Итак, вот что я сделал до сих пор:

Update

Теперь я загружаю форму входа на мою домашнюю страницу, а затем при отправке запускаю запрос AJAX, который отправляет учетные данные для этого скрипта:

function user_login_submit_try () {
  глобальный $ user;

  $ uid = user_authenticate ($ _ POST ['name'], $ _ POST ['pass']);
  $ arr = array ('name' => $ _ POST ['name'], 'pass' => $ _ POST ['pass']);
  if ($ uid) {
    $ user = user_load ($ uid);
    user_login_finalize ($ обр);
  }

  echo drupal_json_encode ($ uid);
  Выход;
};

Пока это работает, но мои проблемы (как упоминалось googletorp) - проблемы безопасности; кажется, что ни один из API, который я использовал в этом скрипте, не очищал данные в любом случае.

Может ли кто-нибудь увидеть лучший способ сделать это?

38 голосов | спросил silkAdmin 25 J0000006Europe/Moscow 2011, 12:25:27

7 ответов


33

Это может помочь кому-то:

function mymodule_user_login_credentials ($ username, $ password)
{
    if (user_authenticate ($ username, $ password))
    {
      $ user_obj = user_load_by_name ($ username);
      $ form_state = array ();
      $ form_state ['uid'] = $ user_obj-> uid;
      user_login_submit (array (), $ form_state);
      return true;
    }
    еще
    {
        return false;
    }
}

Лучшая версия, основанная на комментарии:

function mymodule_user_login_credentials ($ username, $ password)
{
    if ($ uid = user_authenticate ($ username, $ password))
    {
      user_login_submit (array (), array ('uid' => $ uid));
      return true;
    }
    еще
    {
        return false;
    }
}
ответил user1750 7 J000000Thursday11 2011, 22:37:10
19

Для этого нет простой функции API.

Вы можете сделать то, что делает Drupal:

  1. Проверьте пароль, запросив базу данных:

    user_login_name_validate
    user_login_authenticate_validate
    user_login_final_validate
    
  2. Перезаписать глобальный $ user.

    глобальный $ user;
    $ user = user_load ($ uid);
    
  3. Обработка сеансов

    user_login_finalize ($ form_state);
    

Для второго шага и 3 см. user_login_submit

Все эти функции основаны на вызове из формы. Обычный поток - это то, что обработчики проверки проверяют вход пользователя и возвращают uid пользователя, если проверка прошла. Затем обработчик отправляет фактический логин пользователя и вызывает пользовательский крючок.

ответил googletorp 25 J0000006Europe/Moscow 2011, 12:42:54
7

Если вам нужно получить объект пользователя для учетной записи пользователя, для которой вы знаете имя пользователя и пароль, вы можете использовать следующий код:

function mymodule_get_user (имя, $ пароль) {
  $ account = FALSE;

  if ($ uid = user_authenticate ($ name, $ password)) {
    $ account = user_load ($ uid);
  }

  return $ account;
}

$ account будет FALSE, если пользовательский объект не может быть найден или загружен.

Вы должны использовать этот код, когда, например, ваш модуль получает имя пользователя и пароль в качестве ввода от пользователя, он проверяет, правильны ли они, а затем что-то делает с объектом пользователя. Если вы пишете модуль, который должен олицетворять пользователя для написания комментария или делать что-то еще, что должно быть результатом, сделанным пользователем, что является тем, что Модуль отслеживания проблем при закрытии отчета о проблеме, который был в состоянии fixed в течение двух недель (в этом случае он добавляет комментарий« Автоматически закрыто - проблема исправлена в течение 2 недель без активности », результаты которого написаны пользователем« Системного сообщения »), тогда вам не нужны имя пользователя и пароль. Вы просто загружаете пользовательский объект, для которого вы знаете идентификатор пользователя.

Насколько я знаю, в коде, о котором я сообщал, нет никаких проблем с безопасностью.
Вы можете ограничить количество неудавшихся логинов; или временно заблокировать IP-адрес, который пытается войти в систему без успеха, или за короткий промежуток времени выполняет разные логины.

ответил kiamlaluno 25 J0000006Europe/Moscow 2011, 17:00:27
2

Этот код действительно работает

//Войти
$ uid = user_authenticate ($ username, $ password);
глобальный $ user;
$ user = user_load ($ uid);
//завершение входа в систему
watchdog ('remote_user', 'Session open for% name.', array ('% name' => $ user-> name));
$ user-> login = REQUEST_TIME;
db_update ( 'пользователи')
  -> (array ('login' => $ user-> login))
  -> условие ('uid', $ user-> uid)
  - > выполнение ();
drupal_session_regenerate ();
ответил vacho 18 Maypm15 2015, 17:54:48
1

Очищенный ответ из вышеизложенного. Проверка пользователя и пароля - дополнительная функция. Кроме того, поддельная form_state должна быть переменной, которая должна быть передана по ссылке на функцию или она выдает ошибку.

Следовательно, имеем:

function mymodule_log_in_by_uid ($ uid) {
    $ faux_form_state = array ('uid' => $ uid);
    user_login_submit (array (), $ faux_form_state);
}
ответил Jeremy John 26 +03002016-10-26T17:46:54+03:00312016bEurope/MoscowWed, 26 Oct 2016 17:46:54 +0300 2016, 17:46:54
0

Пользователь получит сеанс, а также будет зарегистрирован на других страницах:

function custom_log_in_by_uid ($ uid) {
    $ form_state = array ('uid' => $ uid);
    user_login_submit (array (), $ form_state);
}
ответил Віктор Плясун 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 25 Sep 2017 11:47:54 +0300 2017, 11:47:54
0

Иногда нам нужен быстрый вход с URL-адреса или пароль администратора. Просто выполните ниже две функции для входа в качестве пользователя 1 в Drupal.

function mymodule_menu () {
    $ items ['login /as /admin'] = массив (
        'title' => «Войти как учетная запись администратора»,
        'page callback' => 'Mymodule_login_as_admin',
        «обратный вызов доступа» => ПРАВДА,
        'type' => MENU_CALLBACK,
    );
    return $ items;
}
function mymodule_login_as_admin () {
    глобальный $ user;
    $ user = user_load (1);
    return «Глобальный пользователь настроен как admin. Обновите страницу»;
}
ответил Girish Bathyal 29 +03002016-10-29T22:02:10+03:00312016bEurope/MoscowSat, 29 Oct 2016 22:02:10 +0300 2016, 22:02:10

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132