drupal 7 программно регистрирует пользователя

#php #login #drupal-7

#php #аутентификация #drupal-7

Вопрос:

После того, как я только что зарегистрировал новую учетную запись и создал профиль, как я могу войти в систему пользователя?

Я пытался :

 global $user;
$user = user_load($account->uid);
  

или

 global $user;
$user = user_load(array('mail' => $_POST['email'], 'pass' => trim($_POST['password'])));
  

но ни то, ни другое не работает, а второе приводит к ошибке array_flip.

Ответ №1:

Я собираюсь ответить на это для дальнейшего использования, потому что третий ответ выше неверен, а первый ответ будет работать, но не нужен (он повторяет опыт пользователя, отправляющего форму входа, вызывающего все валидаторы и т.д., И, По-видимому, вы уже выполнили эту проверку, иначе вы бы не пытались войти в систему пользователя напрямую.

Это будет работать, как ожидалось, при условии, что у вас есть $username и $password из вашей собственной формы или функции, и вы знаете, что пользователь не вошел в систему:

 if ($uid = user_authenticate($username, $password)) {
  global $user;
  $user = user_load($uid);

  $login_array = array ('name' => $username);
  user_login_finalize($login_array);
}
  

Сначала вы подтверждаете имя пользователя и пароль, которые у вас есть. Если вы получите обратно ненулевой UID, аутентификация прошла успешно. Вы создаете массив, который предоставляет единственную, возможно, необходимую часть информации, которая была в исходной форме входа, и передаете ее в user_login_finalize() , который выполняет все остальное (не только регенерирует сеанс, но также правильно записывает логин и вызывает перехваты входа).

Комментарии:

1. Большое спасибо за ответ. Я попытался отправить редактирование, но в нем было слишком мало символов — мне пришлось передать $login_array по ссылке, чтобы это заработало (так user_login_finalize(amp;$login_array); ). Еще раз спасибо!

2. Эй, @Ken, я поместил этот код в функцию и попытался вызвать его с помощью hook_menu(), hook_boot() в page.tpl, но у меня это не работает. Либо это я показываю пустую страницу без сообщения, либо я получил логин на странице (созданный через hook_menu ()), но затем для других страниц я автоматически выхожу из системы. Можете ли вы, пожалуйста, помочь мне?

3. @DineshSubhashPatil — пустая страница без сообщения (легендарный WSOD) почти наверняка означает, что произошла ошибка сервера. Проверьте журналы вашего веб-сервера, чтобы увидеть, что происходит не так. Также вы могли бы добавить некоторую проверку на ошибки; в частности, перед вызовом user_login_finalize убедитесь $user , что это допустимый объект. Вторая проблема менее понятна, но, возможно, может быть связана с проблемой с сеансом PHP? Я подозреваю, что если вы отследите ошибку WSOD, вы решите проблему.

4. @Ken Спасибо за предложение. Я попробую это.

Ответ №2:

Drupal делает это с помощью user_login_finalize from user_login_submit , вы можете вызвать то же самое самостоятельно с помощью этого кода:

 $form_state['uid'] = $account->uid;
user_login_submit(array(), $form_state);
  

Комментарии:

1. Это хорошее решение, но я столкнулся с проблемой с перенаправлениями. При проверке этой функции я обнаружил, что она устанавливала свойство перенаправления формы. Итак, вместо вызова user_login_submit я использовал код из функции: global $user; $user = user_load($form_state['uid']); $form_state['redirect'] = 'welcome'; user_login_finalize($form_state);

Ответ №3:

Вы можете войти в систему программно в D7, используя следующий код.

 global $user;
$user = user_load($uid);
drupal_session_regenerate();
  

Для этого пользователь должен войти в систему с заданным идентификатором пользователя.

Комментарии:

1. Хорошее, чистое решение.

Ответ №4:

 /**   
*  Drupal 7 Programmatically user Login   
*/

    function hook_menu(){
      $itmes['user/form'] = array(
       'title' => t('Example Form'),
       'description' => 'Drupal Example Form',
       'page callback' => 'drupal_get_form',
       'page arguments' => array('example_form'),
       'access callback' => TRUE,
       'type' => MENU_LOCAL_TASK,
    );
      return $itmes;
   }

   function otp_login_form($form, amp;$form_state){
    $form['name'] = array(
     '#type' => 'textfield',
     '#title' => t('Username'),
     '#description' => t('Enter your @site_name username.',   
            array('@site_name'=> variable_get('site_name'))),
     '#required' => TRUE,
     '#size' => 60,
     '#maxlength' => 60,
     '#weight' => 2,
    );
    $form['password'] = array(
     '#type' => 'password',
     '#title' => t('Password'),
     '#description' => t('Enter the password that accompanies your  username.'),
     '#required' => TRUE,
     '#size' => 60,
     '#maxlength' => 60,
     '#weight' => 3,
    );
    $form['submit'] = array(
     '#type' => 'submit',
     '#value' => t('Login'),
     '#weight' => 4,
    );

    return $form;
  }

  function otp_login_form_submit($form, amp;$form_state){
     if(user_authenticate($form_state['values']['name'], $form_state['values']['password'])) {
     $user_obj = user_load_by_name($form_state['values']['name']);
     $form_state['uid'] = $user_obj->uid;      
     user_login_submit($form,$form_state);
     return true;
   }
   else {
     form_set_error('name', t('Sorry, unrecognized username or password.')); 
     watchdog('user', 'Login attempt by unregistered user %user.', array('%user' => $form_state['values']['name']));

   }
 }
  

Комментарии:

1. Не хотели бы вы дополнить свой ответ, содержащий только код, каким-либо объяснением? Это уменьшило бы ошибочное представление о том, что StackOverflow является бесплатным сервисом для написания кода.

2. Да, пожалуйста, объясните, что вы сделали в коротком предложении. Большое вам спасибо!