Làm cách nào để đăng nhập người dùng theo chương trình?


41

Tôi đang tìm kiếm API cho phép tôi đăng nhập người dùng bằng cách chuyển tên người dùng và mật khẩu. Có ai có kinh nghiệm với điều này?

Để làm rõ, tôi đang cố gắng tạo một hộp đăng nhập AJAX xuất hiện dưới dạng cửa sổ bật lên trên trang chủ và không làm mới trang trong trường hợp thông tin đăng nhập sai, nhưng chỉ khi đăng nhập là chính xác. Vì vậy, đây là những gì tôi đã làm cho đến nay:

Cập nhật

Bây giờ tôi tải biểu mẫu đăng nhập trên trang chủ của mình, sau đó khi gửi, tôi khởi chạy một yêu cầu AJAX gửi thông tin xác thực đến tập lệnh này:

function user_login_submit_try() {
  global $user;  

  $uid = user_authenticate($_POST['name'],$_POST['pass']);    
  $arr = array ('name'=>$_POST['name'],'pass'=>$_POST['pass']);
  if ($uid){
    $user = user_load($uid);
    user_login_finalize($arr);
  }

  echo drupal_json_encode($uid); 
  exit;
}; 

Cho đến nay nó hoạt động, nhưng lo lắng của tôi là (như được đề cập bởi googletorp); Dường như không có API nào tôi sử dụng trong tập lệnh này đã khử trùng dữ liệu.

Bất cứ ai sẽ thấy một cách tốt hơn để làm như vậy?


Vì lý do nào bạn sẽ cần phải đăng nhập người dùng từ mã bằng tên người dùng và mật khẩu?
kiamlaluno

@ kiamlaluno Vì tôi cần sử dụng Ajax trên mẫu đăng nhập. Trong câu hỏi tiền lệ của tôi: drupal.stackexchange.com/questions/5780/... drupal.stackexchange.com/questions/5781/... Tôi không thể giải quyết bất kỳ của hai vấn đề này vì vậy tôi đã đi cho một yêu cầu tùy chỉnh ajax.
lụaAdmin

Câu trả lời:


33

Điều này có thể giúp ai đó:

function mymodule_user_login_credentials($username, $password)
{
    if(user_authenticate($username, $password))
    {
      $user_obj = user_load_by_name($username);
      $form_state = array();
      $form_state['uid'] = $user_obj->uid;      
      user_login_submit(array(), $form_state);
      return true;
    }
    else
    {
        return false;
    }
}

Một phiên bản tốt hơn dựa trên nhận xét:

function mymodule_user_login_credentials($username, $password)
{
    if($uid = user_authenticate($username, $password))
    {
      user_login_submit(array(), array('uid' => $uid));
      return true;
    }
    else
    {
        return false;
    }
}

3
user_authenticate đã trả về $ uid nên không cần tải đối tượng người dùng;)
FLY

7
Khối mã thứ hai sẽ không hoạt động; arg thứ 2 của user_login_submit được thông qua bởi ref; truyền cho nó đầu ra của mảng () sẽ thất bại.
Shawn Conn

Làm thế nào câu trả lời này sẽ được sử dụng để tự động đăng nhập người dùng sau khi họ đã được tạo bằng một hình thức đăng ký? Tôi muốn làm điều đó, nhưng mật khẩu là một hàm băm khi được cung cấp thông qua đối tượng tài khoản làm tham số trong hook_user_insertnhưng các hàm trên trong câu trả lời muốn mật khẩu là văn bản thuần gốc. Tôi đoán tôi sẽ cần phải cố gắng hook_form_alterthay thế ...
nghĩa là

Đối với những người tìm kiếm đăng nhập tự động trực tiếp sau khi người dùng mới được tạo (ví dụ: thông qua biểu mẫu đăng ký người dùng, ví dụ: 'người dùng / đăng ký'), hãy xem giải pháp này: drupal.stackexchange.com/a/254905/1082
Therobyoukn

19

Không có chức năng API đơn giản cho việc đó.

Bạn có thể làm những gì Drupal làm:

  1. Kiểm tra mật khẩu bằng cách truy vấn cơ sở dữ liệu xem:

user_login_name_validate ()
user_login_authenticate_validate ()
user_login_final_validate ()

  1. Ghi đè lên global $user.

    global $user;
    $user = user_load($uid);
    
  2. Xử lý phiên

user_login_finalize($form_state);

Đối với bước hai và 3 xem user_login_submit()

Tất cả các chức năng này dựa trên việc được gọi từ một hình thức. Luồng thông thường là các trình xử lý xác thực kiểm tra đầu vào của người dùng và trả về uid của người dùng nếu xác thực vượt qua. Trình xử lý trình sau đó xử lý đăng nhập thực tế của người dùng và gọi hook người dùng.


cảm ơn googletorp, tôi sẽ thử nó, mặc dù điều này cho tôi tự hỏi làm thế nào các chức năng này hoạt động cùng nhau .. Làm thế nào một người biết rằng tôi đã gọi tiền lệ?
lụaAdmin

ồ và nếu tôi không có biến From_state có sẵn nhưng chỉ cần tên người dùng và mật khẩu, tôi có thể xây dựng lại nó như sau không: $form_state['value']['name'] = $_POST['name']v.v.
SilkAdmin

@silk Bạn nên luôn luôn sử dụng Drupal FAPI cung cấp cho bạn $form_statebiến. Có rất nhiều kiểm tra bảo mật tốt mà nếu không bạn sẽ mất và có thể mở trang web của bạn để tấn công. Khi nói đến việc đăng nhập người dùng, bạn không muốn mất bảo mật đó.
googletorp

Vui lòng kiểm tra câu hỏi được cập nhật của tôi, tôi thực sự muốn biết liệu đầu vào của tôi có được dọn sạch không .. Cảm ơn
lụaAdmin

Xin lỗi, có vẻ như lần chỉnh sửa không hoạt động lần đầu tiên, bây giờ nó đã được cập nhật.
lụaAdmin

7

Nếu bạn cần lấy đối tượng người dùng cho tài khoản người dùng mà bạn biết tên người dùng và mật khẩu, thì bạn có thể sử dụng mã sau:

function mymodule_get_user(name, $password) {
  $account = FALSE;

  if ($uid = user_authenticate($name, $password)) {
    $account = user_load($uid);
  }

  return $account;
}

$accountsẽ là FALSEnếu đối tượng người dùng không thể được tìm thấy hoặc tải.

Bạn nên sử dụng mã này khi, ví dụ, mô-đun của bạn lấy tên người dùng và mật khẩu làm đầu vào từ người dùng, nó xác minh xem họ có đúng không, và sau đó nó làm gì đó với đối tượng người dùng.
Nếu bạn đang viết một mô-đun cần mạo danh người dùng để viết nhận xét hoặc thực hiện một việc khác cần kết quả như người dùng đã thực hiện, đó là điều mà mô-đun theo dõi sự cố dự án thực hiện khi đóng báo cáo sự cố đã có trong trạng thái cố định trong hai tuần (trong trường hợp đó, nó thêm nhận xét "Tự động đóng - sự cố đã được sửa trong 2 tuần không có hoạt động", kết quả được viết bởi người dùng "Thông báo hệ thống"), sau đó bạn không cần tên người dùng và mật khẩu. Bạn chỉ cần tải đối tượng người dùng mà bạn biết ID người dùng.

Theo như tôi biết, không có bất kỳ vấn đề bảo mật nào với mã tôi đã báo cáo.
Bạn có thể muốn giới hạn số lần đăng nhập thất bại; hoặc để chặn tạm thời IP cố gắng đăng nhập mà không thành công hoặc thử các lần đăng nhập khác nhau trong thời gian ngắn.


cảm ơn bạn kiamlaluno, đó là những gì tôi đã làm, nhưng bây giờ tôi đang lo lắng về các vấn đề bảo mật, xin vui lòng kiểm tra câu hỏi cập nhật của tôi
SilkAdmin

3

Mã này thực sự hoạt động

//login
$uid = user_authenticate($username, $password);
global $user;
$user = user_load($uid);    
//login finalize
watchdog('remote_user', 'Session opened for %name.', array('%name' => $user->name));
$user->login = REQUEST_TIME;
db_update('users')
  ->fields(array('login' => $user->login))
  ->condition('uid', $user->uid)
  ->execute();
drupal_session_regenerate();

Nó không gọi hook_user_login, xem hàm user_login_finalize ().
skorzh

2

Làm sạch câu trả lời từ trên. Kiểm tra người dùng và mật khẩu là một tính năng bổ sung. Ngoài ra, form_state giả cần phải là một biến được truyền bằng cách tham chiếu đến hàm hoặc nó đưa ra lỗi.

Do đó chúng ta có:

function mymodule_log_in_by_uid($uid) {
    $faux_form_state = array('uid' => $uid);
    user_login_submit(array(), $faux_form_state);
}

0

Người dùng sẽ nhận được phiên và cũng sẽ đăng nhập vào các trang khác:

function custom_log_in_by_uid($uid) {
    $form_state = array('uid' => $uid);
    user_login_submit(array(), $form_state);
}

0

Đôi khi chúng tôi cần đăng nhập nhanh từ URL hoặc Quên mật khẩu quản trị viên. Chỉ cần thực hiện hai chức năng dưới đây để đăng nhập như người dùng 1 trong Drupal.

function mymodule_menu(){
    $items['login/as/admin'] = array(
        'title' => 'Login as admin account',
        'page callback' => 'mymodule_login_as_admin',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
    );
    return $items;
}
function mymodule_login_as_admin(){
    global $user;
    $user = user_load(1);
    return "Global user set as admin. Please refresh page ";
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.