2011-11-10 36 views
18

Sau khi vừa đăng ký một tài khoản mới và tạo một hồ sơ như thế nào tôi sẽ đăng nhập một người sử dụng?drupal 7 lập trình đăng nhập người dùng trong

Tôi đã thử:

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

hoặc

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

nhưng không phải công việc và kết quả thứ hai trong một lỗi về array_flip.

Trả lời

28

Tôi sẽ trả lời câu hỏi này để tham khảo trong tương lai, vì câu trả lời thứ ba ở trên là sai và câu trả lời đầu tiên sẽ hoạt động nhưng không cần thiết (nó sao chép kinh nghiệm của người dùng gửi biểu mẫu đăng nhập, gọi tất cả trình xác thực, v.v. và có lẽ bạn đã thực hiện xác thực đó hoặc bạn sẽ không cố gắng đăng nhập trực tiếp người dùng.

Điều này sẽ hoạt động như mong đợi, giả sử bạn có $username$password từ biểu mẫu hoặc chức năng của riêng bạn và bạn biết người dùng chưa đăng nhập:

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

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

Trước tiên bạn xác thực e tên người dùng và mật khẩu bạn có. Nếu bạn lấy lại UID khác 0, xác thực đã thành công. Bạn tạo một mảng cung cấp một phần thông tin cần thiết có trong mẫu đăng nhập ban đầu và chuyển nó tới user_login_finalize(), tất cả các phần còn lại (không chỉ tạo lại phiên, mà còn ghi lại thông tin đăng nhập đúng cách và gọi các móc đăng nhập).

+0

Cảm ơn rất nhiều vì câu trả lời. Tôi đã cố gắng để gửi một chỉnh sửa nhưng nó là quá ít ký tự - tôi đã phải vượt qua trong '$ login_array' bằng cách tham khảo để có được điều này để làm việc (vì vậy' user_login_finalize (& $ login_array); '). Cảm ơn một lần nữa! – doubleswirve

+0

Hey, @Ken, tôi đã đặt mã này trong chức năng và đã cố gắng gọi nó bằng cách sử dụng hook_menu(), hook_boot(), trong page.tpl nhưng nó không làm việc cho tôi. Hoặc là tôi đang hiển thị một trang trống không có thông báo hoặc tôi đã đăng nhập trên trang (được tạo thông qua hook_menu()) nhưng sau đó đối với các trang khác, tôi tự động đăng xuất. Bạn có thể giúp tôi không? –

+0

@DineshSubhashPatil - một trang trống không có thông báo (WSOD huyền thoại) gần như chắc chắn có nghĩa là có lỗi máy chủ. Kiểm tra nhật ký máy chủ web của bạn để xem có gì không ổn. Ngoài ra bạn có thể thêm một số kiểm tra lỗi; đặc biệt, trước khi gọi 'user_login_finalize', hãy chắc chắn' $ user' là một đối tượng hợp lệ. Vấn đề thứ hai khó hiểu hơn, nhưng có thể do vấn đề với phiên PHP? Tôi nghi ngờ rằng nếu bạn theo dõi lỗi WSOD, bạn sẽ giải quyết được vấn đề. – Ken

15

Drupal làm nó bằng cách sử user_login_finalize từ user_login_submit, bạn có thể gọi điều tương tự cho mình với mã này:

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

Đây là một giải pháp tốt nhưng tôi chạy vào một vấn đề bằng cách chuyển hướng. Khi kiểm tra chức năng này, tôi thấy rằng nó đã thiết lập thuộc tính chuyển hướng của biểu mẫu. Vì vậy, thay vì gọi user_login_submit, tôi đã sử dụng mã từ hàm: 'người dùng $ toàn cầu; $ user = user_load ($ form_state ['uid']); $ form_state ['redirect'] = 'chào mừng'; user_login_finalize ($ form_state); ' – RevNoah

9

Bạn có thể đăng nhập theo chương trình trong D7 sử dụng đoạn mã sau.

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

Điều đó phải đăng nhập người dùng với id người dùng đã cho.

+0

Giải pháp sạch, đẹp. –

2

Sử dụng đoạn mã sau để tạo lập trình một tài khoản người dùng trong 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

Bạn có muốn tăng thêm câu trả lời chỉ bằng mã của bạn với một số giải thích? Điều đó sẽ làm giảm quan niệm sai lầm rằng StackOverflow là một dịch vụ viết mã miễn phí. – Yunnosch

+0

Có, hãy giải thích, những gì bạn đã làm trong một câu ngắn. Cảm ơn nhiều! – creyD

Các vấn đề liên quan