ฉันจะเข้าสู่ระบบผู้ใช้โดยทางโปรแกรมได้อย่างไร


41

ฉันกำลังมองหา API ที่จะให้ฉันเข้าสู่ระบบผู้ใช้โดยส่งชื่อผู้ใช้และรหัสผ่าน ใครบ้างมีประสบการณ์กับสิ่งนี้หรือไม่?

เพื่อชี้แจงฉันพยายามสร้างกล่องล็อกอิน AJAX ที่ปรากฏเป็นป๊อปอัพในหน้าแรกและอย่ารีเฟรชหน้าเว็บในกรณีที่มีข้อมูลประจำตัวที่ไม่ถูกต้อง แต่เฉพาะในกรณีที่ล็อกอินถูกต้อง ดังนั้นนี่คือสิ่งที่ฉันทำไปแล้ว:

ปรับปรุง

ตอนนี้ฉันโหลดแบบฟอร์มเข้าสู่ระบบในหน้าแรกของฉันจากนั้นในการส่งฉันเปิดตัวคำขอ AJAX ที่ส่งข้อมูลประจำตัวให้กับสคริปต์นี้:

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

มันยังใช้งานได้ แต่ความกังวลของฉันคือปัญหาด้านความปลอดภัย (ดังที่กล่าวไว้โดย googletorp); ดูเหมือนว่าไม่มี API ใดที่ฉันใช้ในสคริปต์นี้ทำให้ข้อมูลถูกทำให้บริสุทธิ์

ใครบ้างจะเห็นวิธีที่ดีกว่าในการทำเช่นนั้น?


คุณจะต้องลงชื่อเข้าใช้ด้วยรหัสใดโดยใช้ชื่อผู้ใช้และรหัสผ่านด้วยเหตุผลใด
kiamlaluno

@ kiamlaluno เพราะฉันต้องใช้ Ajax ในแบบฟอร์มการเข้าสู่ระบบ ในคำถามก่อนหน้าของฉัน: drupal.stackexchange.com/questions/5780/… drupal.stackexchange.com/questions/5781/ ......ฉันไม่สามารถแก้ไขปัญหาสองข้อนี้ได้ดังนั้นฉันจึงไปขอ ajax ที่กำหนดเอง
silkAdmin

คำตอบ:


33

สิ่งนี้อาจช่วยบางคน:

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

รุ่นที่ดีขึ้นตามความคิดเห็น:

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 ส่งคืน $ uid แล้วดังนั้นไม่จำเป็นต้องโหลดวัตถุผู้ใช้;)
FLY

7
การบล็อกโค้ดที่สองจะไม่ทำงาน อาร์กิวเมนต์ที่ 2 ของ user_login_submit ถูกส่งผ่านโดยการอ้างอิง; ผ่านมันผลลัพธ์ของ array () จะล้มเหลว
Shawn Conn

คำตอบนี้จะใช้ในการเข้าสู่ระบบผู้ใช้โดยอัตโนมัติหลังจากที่พวกเขาสร้างขึ้นโดยใช้แบบฟอร์มการลงทะเบียนอย่างไร ฉันต้องการจะทำเช่นนั้น แต่รหัสผ่านเป็นแฮชเมื่อระบุผ่านวัตถุบัญชีเป็นพารามิเตอร์ในhook_user_insertแต่ฟังก์ชั่นด้านบนในคำตอบต้องการรหัสผ่านเป็นข้อความธรรมดาดั้งเดิม ฉันเดาว่าฉันจะต้องลองhook_form_alterแทน ...
therobyouknow

สำหรับผู้ที่มองหาการเข้าสู่ระบบอัตโนมัติโดยตรงหลังจากผู้ใช้ใหม่ถูกสร้างขึ้น (เช่นผ่านแบบฟอร์มการลงทะเบียนผู้ใช้เช่น 'ผู้ใช้ / การลงทะเบียน') ดูวิธีแก้ปัญหานี้: drupal.stackexchange.com/a/254905/1082
therobyouknow

19

ไม่มีฟังก์ชั่น API ที่ง่ายสำหรับสิ่งนั้น

คุณสามารถทำสิ่งที่ Drupal ทำ:

  1. ทดสอบรหัสผ่านโดยการสอบถามฐานข้อมูลดูที่:

user_login_name_validate ()
user_login_authenticate_validate ()
user_login_final_validate ()

  1. global $userเขียนทับ

    global $user;
    $user = user_load($uid);
    
  2. จัดการเซสชัน

user_login_finalize($form_state);

สำหรับขั้นตอนที่สองและ 3 ดู user_login_submit()

ฟังก์ชั่นทั้งหมดเหล่านี้ขึ้นอยู่กับการถูกเรียกจากแบบฟอร์ม โฟลว์ปกติคือตัวตรวจสอบความถูกต้องทดสอบอินพุตผู้ใช้และส่งคืน uid ของผู้ใช้หากการตรวจสอบผ่าน ตัวจัดการการส่งจากนั้นจัดการการเข้าสู่ระบบที่แท้จริงของผู้ใช้และการโทรขอผู้ใช้


ขอบคุณ googletorp ฉันจะลองดูแม้ว่าสิ่งนี้จะให้ฉันสงสัยว่าฟังก์ชั่นนี้ทำงานร่วมกันได้อย่างไรใครจะรู้ได้อย่างไรว่าฉันเรียกใช้แบบอย่างนี้ได้อย่างไร
silkAdmin

โอ้และถ้าฉันไม่มีตัวแปร From_state availlable แต่เพียงแค่ชื่อผู้ใช้และรหัสผ่านฉันสามารถสร้างใหม่ได้เช่น: $form_state['value']['name'] = $_POST['name']และอื่น ๆ ..
silkAdmin

@silk คุณควรใช้ Drupal FAPI ซึ่งให้$form_stateตัวแปรกับคุณเสมอ มีการตรวจสอบความปลอดภัยที่ดีมากมายที่คุณจะปล่อยและเปิดเว็บไซต์ของคุณเพื่อโจมตี เมื่อพูดถึงการเข้าสู่ระบบของผู้ใช้คุณไม่ต้องการสูญเสียความปลอดภัยนั้น
googletorp

โปรดตรวจสอบคำถามที่อัปเดตของฉันฉันต้องการทราบว่าอินพุตของฉันหมดไปหรือไม่ขอบคุณ
silkAdmin

ขออภัยดูเหมือนว่าการแก้ไขจะไม่ทำงานในครั้งแรกขณะนี้การอัปเดต
silkAdmin

7

หากคุณต้องการรับวัตถุผู้ใช้สำหรับบัญชีผู้ใช้ที่คุณรู้จักชื่อผู้ใช้และรหัสผ่านคุณสามารถใช้รหัสต่อไปนี้:

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

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

  return $account;
}

$accountจะเป็นFALSEถ้าไม่พบหรือโหลดวัตถุผู้ใช้

คุณควรใช้รหัสนี้เมื่อโมดูลของคุณได้รับชื่อผู้ใช้และรหัสผ่านเป็นอินพุตจากผู้ใช้มันจะตรวจสอบว่าถูกต้องหรือไม่จากนั้นจะทำบางสิ่งกับวัตถุผู้ใช้
หากคุณกำลังเขียนโมดูลที่จำเป็นต้องปลอมตัวเป็นผู้ใช้เพื่อเขียนความคิดเห็นหรือทำสิ่งอื่นที่ต้องการผลลัพธ์ตามที่ผู้ใช้ทำซึ่งเป็นสิ่งที่โมดูลติดตามปัญหาของโครงการทำเมื่อปิดรายงานปัญหาที่อยู่ในสถานะคงที่เป็นเวลาสองสัปดาห์ (ในกรณีนั้นจะเพิ่มความคิดเห็น "ปิดโดยอัตโนมัติ - ปัญหาได้รับการแก้ไขเป็นเวลา 2 สัปดาห์โดยไม่มีกิจกรรม" ซึ่งผลลัพธ์ที่เขียนโดยผู้ใช้ "ข้อความระบบ") จากนั้นคุณไม่ต้องการชื่อผู้ใช้และรหัสผ่าน คุณเพียงแค่โหลดวัตถุผู้ใช้ที่คุณรู้ว่า ID ผู้ใช้

เท่าที่ฉันรู้ไม่มีปัญหาด้านความปลอดภัยกับรหัสที่ฉันรายงาน
คุณอาจต้องการ จำกัด จำนวนการเข้าสู่ระบบที่ล้มเหลว หรือบล็อก IP ชั่วคราวที่พยายามเข้าสู่ระบบโดยไม่สำเร็จหรือพยายามเข้าสู่ระบบที่แตกต่างกันในระยะเวลาอันสั้น


ขอบคุณ kiamlaluno มันเป็นสิ่งที่ฉันทำ แต่ตอนนี้ฉันกังวลเกี่ยวกับปัญหาด้านความปลอดภัยโปรดตรวจสอบคำถามที่อัปเดตของฉัน
silkAdmin

3

รหัสนี้ใช้งานได้จริง

//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();

ไม่เรียกใช้ hook_user_login ดูฟังก์ชัน user_login_finalize ()
skorzh

2

ล้างคำตอบจากด้านบน การตรวจสอบผู้ใช้และรหัสผ่านเป็นคุณสมบัติเพิ่มเติม นอกจากนี้ form_state ปลอมจะต้องเป็นตัวแปรที่จะส่งผ่านโดยการอ้างอิงไปยังฟังก์ชั่นหรือเกิดข้อผิดพลาด

ดังนั้นเราจึงมี:

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

0

ผู้ใช้จะได้รับเซสชั่นและจะเข้าสู่หน้าอื่น ๆ :

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

0

บางครั้งเราต้องเข้าสู่ระบบอย่างรวดเร็วจาก URL หรือลืมรหัสผ่านผู้ดูแลระบบ เพียงติดตั้งฟังก์ชั่นด้านล่างสองฟังก์ชั่นเพื่อล็อกอินในฐานะผู้ใช้ 1 ใน 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 ";
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.