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.inc
file. Saya ingin melakukan otentikasi seperti yang ditunjukkan pada gambar:
SKENARIO: Login
Detail langkah-langkahnya adalah:
- Ganti formulir login untuk mengirimkan nama pengguna dan kata sandi ke server SSO ( bukan pada Drupal , tetapi pada .NET).
- 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?).
- 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_name
variabel, dan dengan nilai$sid
. Saya ingin Drupal tidak mengatur cookie di sini, alih-alih mengirim nilai variabel ke server SSO. - Server SSO akan mengambil nilai, membuat cookie, dan meletakkannya di domain utama
domain.com
(untuk mengingatkan keduanyamy website
dansso server
berada 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:
- Di mana saya harus mencari untuk memahami bagaimana otentikasi Drupal dan manajemen sesi bekerja secara mendalam?
- Apakah ada cara di mana saya bisa memanggil fungsi dalam
includes/session.inc
menggunakan 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).
Jawaban:
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_inc
variabel ke jalur file yang menyediakan implementasi alternatif dari fungsi-fungsi yang ditemukan diincludes/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 diotentikasiuser_load()
ke dalam$user
variabel global , kemudian memanggiluser_login_finalize()
sesi yang menangani, masuk timestamp dalamuser
tabel dan memanggilhook_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 menggunakanuser_save()
,user_set_authmaps()
,user_login_submit()
danuser_external_load()
dari Anda kustom memanggil, menggunakanuser_external_login_register()
sebagai template dari apa yang perlu dilakukan.sumber
user_authenticate () APi mungkin berguna di sini.
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_domain
ke domain. Maka cookie di subsite akan tersedia di situs induk.sumber
user_authenticate
karena, otentikasi tidak perlu terjadi di situs Drupal. Saya dapat membuat sesi dengan menelepondrupal_session_generate()
dandrupal_session_regenerate()
dari file session.inc. Anda sudah benar tentang persyaratan untuk cookie .. silakan lihat hasil edit.