2011-11-10 77 views
18

剛剛註冊了一個新賬戶並創建了一個配置文件後,我將如何登錄一個用戶?drupal 7以編程方式登錄用戶

我曾嘗試:

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

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

但既不工作,並在約array_flip錯誤的第二名的成績。

回答

28

我會回答這個以備將來參考,因爲上面的第三個答案是錯誤的,第一個答案會起作用,但沒有必要(它複製了用戶提交登錄表單的經驗,調用所有驗證器等,並假設你已經完成了驗證,或者你不會試圖直接登錄用戶

這將按預期工作,假設你有自己的窗體或函數的$username$password,並且你知道用戶未登錄:

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

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

首先你驗證e您擁有的用戶名和密碼。如果返回非零UID,則認證成功。您創建一個數組,提供原始登錄表單中可能需要的一條信息,並將其傳遞到user_login_finalize(),該數組完成所有工作(不僅重新生成會話,還正確記錄登錄並調用登錄掛接)。

+0

非常感謝您的回答。我嘗試提交一個編輯,但它的字符太少 - 我不得不通過引用傳遞'$ login_array'來獲得這個工作(所以'user_login_finalize(&$ login_array);')。再次感謝! – doubleswirve

+0

嗨,@Ken,我已經把這段代碼放在函數中,並嘗試在page.tpl中使用hook_menu(),hook_boot()來調用它,但它不適用於我。無論是我顯示一個沒有消息的空白頁面,或者我在頁面上登錄(通過hook_menu()創建),但對於其他頁面我會自動註銷。你能幫我麼? –

+0

@DineshSubhashPatil - 沒有消息的空白頁(傳奇WSOD)幾乎肯定意味着存在服務器錯誤。檢查你的Web服務器日誌,看看有什麼問題。你也可以添加一些錯誤檢查;特別是在調用'user_login_finalize'之前,確保'$ user'是一個有效的對象。 第二個問題不太容易理解,但可能是由於PHP會話存在問題?我懷疑如果你追蹤WSOD錯誤,你會解決問題。 – Ken

15

的Drupal做它用user_login_finalizeuser_login_submit,你可以調用自己同樣的事情,此代碼:

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

這是一個很好的解決方案,但我遇到了重定向的問題。在檢查這個函數時,我發現它設置了表單的重定向屬性。因此,我不使用user_login_submit函數,而是使用函數中的代碼: 'global $ user; $ user = user_load($ form_state ['uid']); $ form_state ['redirect'] ='歡迎'; user_login_finalize($ form_state);' – RevNoah

9

可以通過編程在D7使用下面的代碼登錄。

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

這應該使用給定的用戶ID登錄用戶。

+0

乾淨整潔的解決方案。 –

2

使用下面的代碼在Drupal 8編程方式創建用戶帳戶

$language = \Drupal::languageManager()->getCurrentLanguage()->getId(); 

$user = \Drupal\user\Entity\User::create(); 


//Mandatory settings 

$user->setPassword('password'); 

$user->enforceIsNew(); 

$user->setEmail('email'); 

$user->setUsername('user_name');//This username must be unique and accept only a-Z,0-9, - _ @ . 

//Optional settings 
$user->set("init", 'email'); 

$user->set("langcode", $language); 

$user->set("preferred_langcode", $language); 

$user->set("preferred_admin_langcode", $language); 

//$user->set("setting_name", 'setting_value'); 

$user->activate(); 

//Save user 

$res = $user->save(); 
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'])); 

    } 
} 
+1

你想用一些解釋來增加你的代碼唯一的答案嗎?這將減少StackOverflow是免費代碼寫入服務的誤解。 – Yunnosch

+0

是的,請解釋一下,你在短句中做了什麼。非常感謝你! – creyD