it-swarm-vi.com

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

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à 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 trong mọi trường hợp.

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

41
silkAdmin

Đ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;
    }
}
33
user1750

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

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

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

ser_login_name_validate ()
[.__.] ser_login_authenticate_validate ()
[.__.] ser_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.

19
googletorp

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;
}

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

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 Theo dõi vấn đề dự án mô-đun thực hiện khi đóng báo cáo sự cố đã ở trạng thái đã sửa trong hai tuần (trong trường hợp đó, nó sẽ thêm nhận xét "Tự động đóng - vấn đề đã 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.

7
kiamlaluno

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();
3
vacho

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 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);
}
2
Jeremy John

Người dùng sẽ nhận được phiên và cũng sẽ được đă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);
}
1

Đô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 ";
}
0
Girish Bathyal