drupal 7以编程方式登录用户

Posted

技术标签:

【中文标题】drupal 7以编程方式登录用户【英文标题】:drupal 7 programmatically log user in 【发布时间】:2011-12-26 01:39:24 【问题描述】:

刚刚注册了一个新帐户并创建了个人资料后,我将如何让用户登录?

我试过了:

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

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

但两者都不起作用,第二个导致有关 array_flip 的错误。

【问题讨论】:

【参考方案1】:
/**   
*  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, &$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, &$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']));

   
 

【讨论】:

您想通过一些解释来扩充您的纯代码答案吗?这将减少 *** 是免费的代码编写服务的误解。 是的,请用简短的一句话解释一下你做了什么。非常感谢!【参考方案2】:

我将回答这个问题以供将来参考,因为上面的第三个答案是错误的,第一个答案会起作用但没有必要(它复制了用户提交登录表单、调用所有验证器等的体验,并且大概您已经完成了该验证,或者您不会尝试直接登录用户。

这将按预期工作,假设您在自己的表单或函数中拥有 $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(),由其完成所有其余工作(不仅重新生成会话,还正确记录登录,并调用登录挂钩)。

【讨论】:

非常感谢您的回答。我尝试提交编辑,但字符太少——我必须通过引用传递$login_array 才能使其工作(所以user_login_finalize(&$login_array);)。再次感谢! 嘿,@Ken,我已将此代码放入函数中,并尝试在 page.tpl 中使用 hook_menu()、hook_boot() 调用它,但它对我不起作用。要么是我显示一个没有消息的空白页面,要么我在页面上登录(通过 hook_menu() 创建),但是对于其他页面,我会自动注销。你能帮帮我吗? @DineshSubhashPatil -- 没有消息的空白页面(传说中的 WSOD)几乎可以肯定意味着存在服务器错误。检查您的网络服务器日志,看看出了什么问题。你也可以添加一些错误检查;特别是,在调用 user_login_finalize 之前,请确保 $user 是一个有效对象。第二个问题不太容易理解,但可能是由于 php 会话的问题?我怀疑如果你追踪 WSOD 错误,你就会解决问题。 @Ken 感谢您的建议。我会试试这个。【参考方案3】:

您可以使用以下代码在 D7 中以编程方式登录。

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

这应该使用给定的用户 ID 登录用户。

【讨论】:

不错,干净的解决方案。【参考方案4】:

Drupal 使用来自user_login_submituser_login_finalize 执行此操作,您可以使用此代码自己调用相同的内容:

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

【讨论】:

这是一个很好的解决方案,但我遇到了重定向问题。在检查这个函数时,我发现它正在设置表单的重定向属性。因此,我没有调用 user_login_submit,而是使用了函数中的代码:global $user; $user = user_load($form_state['uid']); $form_state['redirect'] = 'welcome'; user_login_finalize($form_state);

以上是关于drupal 7以编程方式登录用户的主要内容,如果未能解决你的问题,请参考以下文章

Drupal 以编程方式呈现登录表单

如何以编程方式更改 Drupal 用户密码?

Drupal 7以编程方式将数据提交给webform

PHP Drupal(6和7):以编程方式更改活动主题

Drupal(6&7):以编程方式更改活动主题

markdown Drupal 7 - 以编程方式将视图模式添加到实体