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_submit
的user_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以编程方式登录用户的主要内容,如果未能解决你的问题,请参考以下文章