ทำความเข้าใจเกี่ยวกับการจัดการเซสชันของ Drupal และการตรวจสอบผู้ใช้


16

ฉันมีข้อกำหนดที่ฉันต้องแทนที่การตรวจสอบผู้ใช้เริ่มต้นด้วยการตรวจสอบของเซิร์ฟเวอร์กลางเช่นเซิร์ฟเวอร์ SSO
ด้วยการแก้ไขข้อบกพร่อง Drupal ฉันรู้ว่าการจัดการเซสชันทั้งหมดเกิดขึ้นในincludes/session.incไฟล์ ฉันต้องการตรวจสอบสิทธิ์ตามที่แสดงในภาพ:

ตะครุบ

สถานการณ์: เข้าสู่ระบบ
รายละเอียดของขั้นตอนจะเป็น:

  1. แทนที่ฟอร์มล็อกอินเพื่อส่งชื่อผู้ใช้และรหัสผ่านไปยังเซิร์ฟเวอร์ SSO ( ไม่ใช่บน Drupalแต่เป็นบน. NET)
  2. ตรวจสอบผู้ใช้บนเซิร์ฟเวอร์ SSO โดยใช้ฐานข้อมูลของไซต์นั้น และส่งคำตอบกลับไปยังหน้า PHP ที่กำหนดเองของเว็บไซต์ของฉัน (หรือแบบฟอร์มโดยโมดูล?)
  3. ใช้การตอบกลับระบุผู้ใช้ในตารางผู้ใช้และสร้างเซสชันสำหรับผู้ใช้นั้นโดยไม่ตรวจสอบรหัสผ่าน (เพราะจะหมายถึงการพิสูจน์ตัวตนสองครั้ง) โดยค่าเริ่มต้น Drupal ชุดคุกกี้ที่มีชื่อของตัวแปรและมีความคุ้มค่า$insecure_session_name $sidฉันต้องการ Drupal ไม่ให้ตั้งค่าคุกกี้ที่นี่แทนส่งค่าของตัวแปรไปยังเซิร์ฟเวอร์ SSO
  4. เซิร์ฟเวอร์ SSO จะรับค่าสร้างคุกกี้และวางในโดเมนหลักdomain.com(เพื่อเตือนให้ทั้งคู่my websiteและsso serverอยู่ในโดเมนย่อยของโดเมนหลักซึ่งไม่ได้อยู่ใน Drupal ด้วย) จากนั้นเว็บไซต์ drupal สามารถเข้าสู่ระบบโดยใช้คุกกี้นั้น

ฉันรู้ว่ามันเป็นคำถามที่ยากมากฉันแค่มองหาพอยน์เตอร์ว่าจะเริ่มอย่างไรดี? ตามที่พวกเขาพูดว่า "คุณไม่ควรแฮ็คหลัก" ดังนั้นคำถามของฉันคือ:

  1. ฉันควรค้นหาเพื่อทำความเข้าใจว่า Drupal authentication และการจัดการเซสชันทำงานในเชิงลึกได้อย่างไร
  2. มีวิธีที่ฉันสามารถเรียกใช้ฟังก์ชั่นในการincludes/session.incใช้ hooks (ตามความเห็นที่มีฟังก์ชั่นบอกว่า "สำหรับการใช้งานภายในเท่านั้น / ไม่ได้รับการแก้ไข")?

หมายเหตุ:ฉันจะใช้วิธีการเดียวกันในการลงทะเบียนผู้ใช้เพื่อให้ระเบียนยังคงอยู่ในฐานข้อมูลกลางของเซิร์ฟเวอร์ SSO และในระหว่างนั้นจะใส่รหัสผ่านขยะสำหรับผู้ใช้เดียวกันในฐานข้อมูลของเว็บไซต์ Drupal (เนื่องจากรหัสผ่านจะไม่ถูกตรวจสอบในขณะที่เข้าสู่ระบบ)


คุณต้องการ SSO จริง (เข้าสู่ระบบหนึ่งเว็บไซต์และคุณเข้าสู่ระบบในทุกเว็บไซต์) หรือเพียงแค่รับรองความถูกต้องกับระบบภายนอก?
mpdonadio

@MPD ฉันต้องการ SSO จริงซึ่งจะต้องมีการเข้าสู่ระบบในหนึ่งเว็บไซต์และ -> รับรองความถูกต้องผู้ใช้เดียวกันในทุกเว็บไซต์ (อาจไม่ได้อยู่ใน Drupal
AjitS

@AjitS หากคุณประสบความสำเร็จในการดำเนินการนี้คุณสามารถโปรดใส่คำตอบโดยละเอียด ฉันใช้ user_login_finalize แต่ฉันถูกบอกเนื่องจากปัญหา GDPR ฉันไม่สามารถเก็บรายละเอียดใน Drupal ได้
Jignesh Rawal

คำตอบ:


17

สนับสนุน Drupal การตรวจสอบภายนอก มีหลายทางเลือกโมดูลการตรวจสอบสำหรับ Drupal เช่น OpenID (รวมอยู่ในหลัก) เป็นOAuth เชื่อมต่อหรือLDAP เรียนรู้เพิ่มเติมเกี่ยวกับวิธีการตรวจสอบสิทธิ์ของ Drupal สิ่งที่ดีที่สุดคือการดูที่โมดูล OpenID และ OAuth และไปที่แบบฟอร์มการเข้าสู่ระบบหลักส่งการโทรกลับ แต่ AFAIK พวกเขามักจะเริ่มเซสชันปกติของ Drupal หลังจากการตรวจสอบสิทธิ์สำเร็จ

สำหรับการจัดการเซสชั่น Drupal เสียบเข้ากับการจัดการเซสชั่น PHP และลงทะเบียนตัวจัดการของมันเอง แบ็กเอนด์เซสชั่น Drupal เป็นตัวเอง pluggable คุณสามารถตั้งค่าตัวแปรไปยังเส้นทางของไฟล์ให้การใช้งานฟังก์ชั่นทางเลือกของการที่พบในsession_inc memcacheโมดูลใช้นี้เพื่อเก็บในเซสชั่น memcachedincludes/session.inc

สำหรับการอ้างอิงโมดูล OpenID จัดการการรับรองความถูกต้องที่ประสบความสำเร็จopenid_authentication()ซึ่งตัวเองceatsและโทรแบบฟอร์มการเข้าสู่ระบบของผู้ใช้ส่งตัวจัดการ (เช่น. user_login_submit()) ตัวจัดการการส่งนี้ง่ายมากมันโหลดผู้ใช้ที่ได้รับการพิสูจน์ตัวตนสำเร็จแล้วuser_load()ลงใน$userตัวแปรโกลบอลจากนั้นเรียกuser_login_finalize()ว่าจัดการเซสชันการประทับเวลาเข้าสู่ระบบในuserตารางและเรียกhook_user_login()ใช้งาน

อีกทางเลือกหนึ่งคือการใช้user_external_login_register()ฟังก์ชั่น ฟังก์ชั่นจะเข้าสู่ระบบผู้ใช้ภายนอกนอกจากนี้ยังสร้างผู้ใช้ภายในหากจำเป็น หากคุณต้องการการควบคุมมากขึ้นในการสร้างผู้ใช้ท้องถิ่นคุณสามารถใช้user_save(), user_set_authmaps(), user_login_submit()และuser_external_load()จากคุณกำหนดเองเรียกใช้user_external_login_register()เป็นแม่แบบของสิ่งที่ต้องทำ


2
นี่คือจุดที่สวยมาก ด้าน Drupal ของการเข้าสู่ระบบผู้ใช้ภายนอกนั้นง่ายมาก การยกของหนัก (ถ้ามี) จริง ๆ แล้วเชื่อมต่อกับระบบภายนอก
mpdonadio

@MPD ค้นหาสิ่งที่ตรงกันข้ามในกรณีเฉพาะของฉัน ระบบภายนอก = บริการเว็บ JSON = สิ่งที่ค่อนข้างง่าย Drupal behavior = การเปลี่ยนแปลงที่คาดไม่ถึงจากรุ่นเป็นรุ่น = ยากเหมือนนรกและไม่มีการวินิจฉัยที่มีประโยชน์เมื่อสิ่งต่าง ๆ แตกหัก
Trejkaz

1

user_authenticate () APi อาจมีประโยชน์ที่นี่

3. การใช้การตอบสนองระบุผู้ใช้ในตารางผู้ใช้และสร้างเซสชันสำหรับผู้ใช้นั้นโดยไม่ตรวจสอบรหัสผ่าน (เพราะจะหมายถึงการพิสูจน์ตัวตนสองครั้ง) โดยค่าเริ่มต้น Drupal ชุดคุกกี้ที่มีชื่อของตัวแปรและมีความคุ้มค่า$insecure_session_name $sidฉันต้องการ Drupal ไม่ให้ตั้งค่าคุกกี้ที่นี่แทนส่งค่าของตัวแปรไปยังเซิร์ฟเวอร์ SSO

แก้ไข: เมื่อเซิร์ฟเวอร์ SSO กลับมาพร้อมกับใช้จริง API นี้เพื่อเข้าสู่ระบบผู้ใช้ซึ่งจะดูแลเซสชั่นสำหรับคุณโดยอัตโนมัติ ฉันคิดว่ามันจะดีกว่าถ้าคุณใช้user_authenticate()แทนที่จะสร้างเซสชันด้วยตัวเอง มันไม่ควรสร้างปัญหาแม้แต่การพิสูจน์ตัวตนสองเท่าตราบใดที่มีการให้ p-assowrd ที่ถูกต้อง

ไม่แน่ใจ 4. คุณต้องการให้คุกกี้ปรากฏในทั้งสองโดเมนหรือไม่ ถ้าเป็นเช่นนั้นใน settings.php เริ่มต้น $cookie_domainกับโดเมน จากนั้นคุกกี้ในไซต์ย่อยจะพร้อมใช้งานในไซต์แม่


ขอขอบคุณสำหรับการตอบสนองของคุณ. ฉันไม่สามารถใช้user_authenticateเพราะการรับรองความถูกต้องไม่จำเป็นต้องเกิดขึ้นในเว็บไซต์ Drupal ฉันสามารถสร้างเซสชั่นโดยการโทรdrupal_session_generate()และdrupal_session_regenerate()จากไฟล์ session.inc คุณเข้าใจถูกต้องเกี่ยวกับข้อกำหนดสำหรับคุกกี้ .. โปรดดูการแก้ไข
AjitS

@indrock ตรวจสอบลิงค์นั้น User_authenticate จะช่วยให้คุณสามารถเข้าสู่ระบบชื่อผู้ใช้และรหัสผ่านที่ถูกต้อง ในขั้นตอนที่ 3 เมื่อคุณยืนยันว่าชื่อผู้ใช้ & รหัสผ่านถูกต้องบนเซิร์ฟเวอร์ SSO จากนั้นใช้ API นี้เพื่อลงชื่อเข้าใช้ผู้ใช้ แต่คุณควรเก็บรหัสผ่านไว้ใน Drupal การทำเช่นนี้จะทำให้ง่ายกว่าแฮ็คหลัก
GoodSp33d
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.