Memahami manajemen sesi Drupal dan otentikasi pengguna

16

Saya memiliki persyaratan di mana, saya harus mengganti otentikasi pengguna default dengan otentikasi server pusat yaitu server SSO.
Dengan debugging Drupal saya mengetahui bahwa semua manajemen sesi terjadi dalam includes/session.incfile. Saya ingin melakukan otentikasi seperti yang ditunjukkan pada gambar:

jepret

SKENARIO: Login
Detail langkah-langkahnya adalah:

  1. Ganti formulir login untuk mengirimkan nama pengguna dan kata sandi ke server SSO ( bukan pada Drupal , tetapi pada .NET).
  2. Otentikasi pengguna di server SSO menggunakan database situs itu; dan mengirim respons kembali ke halaman PHP khusus di situs web saya (atau formulir dengan modul?).
  3. Menggunakan respons, mengidentifikasi pengguna di tabel pengguna , dan membuat sesi untuk pengguna itu tanpa memeriksa kata sandi (karena itu berarti otentikasi ganda). Secara default, Drupal menetapkan cookie dengan nama $insecure_session_namevariabel, dan dengan nilai $sid. Saya ingin Drupal tidak mengatur cookie di sini, alih-alih mengirim nilai variabel ke server SSO.
  4. Server SSO akan mengambil nilai, membuat cookie, dan meletakkannya di domain utama domain.com(untuk mengingatkan keduanya my websitedan sso serverberada di sub domain dari domain utama, yang juga tidak dalam Drupal). Kemudian, situs drupal dapat login dengan menggunakan cookie itu.

Saya tahu ini adalah pertanyaan yang sulit, saya hanya mencari petunjuk bagaimana saya harus mulai? seperti yang mereka katakan "Anda tidak harus meretas inti". Jadi, pertanyaan saya adalah:

  1. Di mana saya harus mencari untuk memahami bagaimana otentikasi Drupal dan manajemen sesi bekerja secara mendalam?
  2. Apakah ada cara di mana saya bisa memanggil fungsi dalam includes/session.incmenggunakan kait (seperti komentar dengan fungsi mengatakan "hanya untuk penggunaan internal / tidak untuk dimodifikasi")?

CATATAN: Saya akan menggunakan metode yang sama untuk mendaftarkan pengguna, sehingga catatan tetap berada di basis data pusat server SSO. Dan selama itu akan dimasukkan beberapa kata sandi sampah untuk pengguna yang sama di basis data situs Drupal (karena kata sandi tidak akan diperiksa saat masuk).

Ajit
sumber
Apakah Anda memerlukan SSO yang benar (masuk ke satu situs dan Anda masuk ke semua situs), atau hanya mengautentikasi terhadap sistem luar?
mpdonadio
@MPD Saya ingin SSO yang benar, yang akan memerlukan login di satu situs dan -> mengotentikasi pengguna yang sama di semua situs (mungkin tidak ada di Drupal.
AjitS
@ Ajit jika Anda berhasil menerapkan ini, tolong cantumkan jawaban terperinci. saya menggunakan user_login_finalize tetapi saya diberitahu karena masalah GDPR saya tidak bisa menyimpan detail di Drupal.
Jignesh Rawal

Jawaban:

17

Drupal mendukung otentikasi eksternal . Ada banyak modul otentikasi alternatif untuk Drupal, seperti OpenID (termasuk dalam inti), Konektor OAuth , atau LDAP . Pelajari lebih lanjut tentang cara kerja otentikasi Drupal; yang terbaik adalah dengan melihat modul OpenID dan OAuth, dan ke form login inti, kirim panggilan balik. Tapi, AFAIK, mereka selalu memulai sesi Drupal normal setelah otentikasi berhasil.

Untuk manajemen sesi, Drupal menghubungkan ke penanganan sesi PHP dan mendaftarkannya sebagai penangan. Backend sesi Drupal sendiri dapat digunakan, Anda dapat mengatur session_incvariabel ke jalur file yang menyediakan implementasi alternatif dari fungsi-fungsi yang ditemukan di includes/session.inc. The memcache modul menggunakan ini untuk menyimpan sesi di memcached.

Untuk referensi, modul OpenID menangani otentikasi yang berhasil di openid_authentication()mana itu sendiri berhenti dan memanggil formulir masuk pengguna menyerahkan handler (mis. user_login_submit()). Handler submit ini sendiri sederhana, memuat pengguna yang berhasil diotentikasi user_load()ke dalam $uservariabel global , kemudian memanggil user_login_finalize()sesi yang menangani, masuk timestamp dalam usertabel dan memanggil hook_user_login()implementasi.

Pilihan lain adalah penggunaan user_external_login_register()fungsi. Fungsi ini akan mencatat pengguna eksternal. Ini juga menciptakan pengguna lokal jika diperlukan. Jika Anda membutuhkan kontrol lebih pada penciptaan pengguna lokal, Anda selalu dapat menggunakan user_save(), user_set_authmaps(), user_login_submit()dan user_external_load()dari Anda kustom memanggil, menggunakan user_external_login_register()sebagai template dari apa yang perlu dilakukan.

Pierre Buyle
sumber
2
Ini cukup tepat. Sisi Drupal dari login pengguna eksternal ternyata sangat mudah. Pengangkatan berat (jika ada) sebenarnya berinteraksi dengan sistem eksternal.
mpdonadio
@MPD Menemukan yang sebaliknya, dalam kasus khusus saya. Sistem eksternal = layanan web JSON = hal-hal yang relatif mudah. Perilaku Drupal = berubah tak terduga dari versi ke versi = sulit sekali dan tidak ada diagnostik yang berguna saat ada masalah.
Trejkaz
1

user_authenticate () APi mungkin berguna di sini.

3.Menggunakan respons, mengidentifikasi pengguna di tabel pengguna , dan membuat sesi untuk pengguna tersebut tanpa memeriksa kata sandi (karena itu berarti otentikasi ganda). Secara default, Drupal menetapkan cookie dengan nama $insecure_session_namevariabel, dan dengan nilai $sid. Saya ingin Drupal tidak mengatur cookie di sini, alih-alih mengirim nilai variabel ke server SSO.

EDIT: Setelah server SSO kembali dengan benar menggunakan API ini untuk masuk pengguna yang secara otomatis akan mengurus sesi untuk Anda. Saya pikir lebih baik jika Anda menggunakan user_authenticate()daripada membuat sesi sendiri. Seharusnya tidak membuat masalah bahkan otentikasi ganda selama p-assowrd yang valid disediakan.

Tidak yakin dengan 4. Apakah Anda ingin cookie terlihat di kedua domain? Jika demikian maka dalam settings.php menginisialisasi $cookie_domainke domain. Maka cookie di subsite akan tersedia di situs induk.

GoodSp33d
sumber
Terima kasih atas tanggapan Anda. Saya tidak dapat menggunakan user_authenticatekarena, otentikasi tidak perlu terjadi di situs Drupal. Saya dapat membuat sesi dengan menelepon drupal_session_generate()dan drupal_session_regenerate()dari file session.inc. Anda sudah benar tentang persyaratan untuk cookie .. silakan lihat hasil edit.
AjitS
@indrock Periksa tautan itu. User_authenticate akan memungkinkan Anda untuk login pengguna asalkan nama pengguna & kata sandi benar. Di Langkah 3 ketika Anda memverifikasi bahwa nama pengguna & pass sudah benar di server SSO kemudian gunakan API ini untuk masuk ke pengguna. Tetapi Anda harus menyimpan kata sandi di Drupal. Melakukan ini akan membuatnya lebih mudah daripada meretas inti.
GoodSp33d