Drupal 6.XX Single Sign On

Salam Sejahtera

Setelah berhari-hari membaca dan memahami Documentation API untuk Drupal. Akhirnya, pening kepala saya itu memberikan hasil yang bagus. Dokumentasi itu amatlah penting, Tanpanya penulis skrip akan tersesat jauh kerana tidak faham akan process yang ada di Drupal. Bila dah paham barulah kita boleh menulis skrip mengikut suka kita.

Senario saya adalah seperti berikut, setiap pelajar perlu mempunyai akaun perpustakaannya yang tersendiri. Namun, tidak ada sebarang integrasi diantara Sistem Pelajar dengan Sistem Perpustakaan. Mungkin atas sebab keselamatan, atau isu kompatibiliti, Data Sharing antara database tidak boleh dilakukan.

Keduanya, oleh kerana tidak ada integrasi antara Sistem, pelajar menggunakan sebuah akaun Generic untuk semua aktiviti Perpustakaan (Online Database sahaja). Makna kata Pelajar A, Pelajar B, Staff A dan B menggunakan Akaun yang sama untuk akses ke Online Database. Sebenarnya lebih mudah begini, tetapi di penghujung cerita, kami tidak boleh membuat database tracking kepada pengguna. Kita tidak dapat membezakan Pengguna A dengan Pelajar B dan sebagainya.

Oleh itu, timbullah idea ini untuk mendaftarkan mereka secara automatik dikala mereka membuka portal perpustakaan. Macam2 functions yang saya guna antaranya ialah

  1. hook_form_alter
  2. user external login register
  3. dan macam2 lagi.

Namun, kesemua ini adalah komplikated dan panjang ceritanya. Akhirnya, terdapat satu function yang paling mudah dan murah. Cukup senang dan kecil. Iaitu user_save & user_authenticate. Simple sungguh penulisan skripnya.

Sebelum itu, kita kaji dahulu workflownya

  1. Login ke iPortal
  2. Kemudian Drupal akan check data pelajar samada wujud atau tidak
  3. Jika Wujud, Drupal akan Load datanya
  4. Jika tidak Drupal akan Create data Pelajar dan Load
  5. Login ke Sistem secara halus (Pengguna tidak perlu tahu akan hal ini)

Snippet nya adalah seperti berikut (Nanti saya install Code Filter)

<?php

$iportal_userdata = array (
'name' => "$name",
'pass' => "$password",
'mail' => "$email",
'status' => 1,
'init' => 'External Authentication'
);

if (!db_result(db_query("SELECT COUNT(*) FROM {users} WHERE name = '%s';", $name))) {
// Kalau Data Pelajar itu Tidak Wujud. Kita bikin baru untuk dia.
user_save (NULL, $iportal_userdata);
// Kemudian kita Load Data
user_authenticate ($iportal_userdata);
}

else {
// Kalau data Pelajar Wujud, Kita Load datanya
user_authenticate ($iportal_userdata);
}

?>