- külső autentikáció
- hook_auth
Jelenlegi projektemnél szükség van arra, hogy a drupal saját felhasználó adatbázisa helyett vagy mellett egy külső forrásból is autentikálni tudjuk a felhasználókat.
Mind az 5-ös, mind a 6-os verzióban van erre lehetőség, de érdekes módon mindkét verzióban Drupal core bug-ok színesítik az életünket. Sajnos volt szerencsém végigküzdeni mindkét verzióval ezt a problémát.
Ebben a post-ban az 5-ös verzió megoldását mutatom be, egy következőben meg a 6-os alatt.
Drupal 5.x és a hook_auth
A Drupal mindig a belső felhasználó adatbázishoz próbál először autentikálni. Ha ez nem sikerült, akkor megnézi, hogy van-e hook_auth implementáció valamely modulban. Ha van ilyen, akkor végig hívogatja azokat, és ha valamelyik TRUE-val tér vissza, akkor létrehoz egy új felhasználót a megadott felhasználónév/jelszó/szerver hármassal. (A szerver a felhasználónév @ utáni részét jelenti, ha van egyáltalán. Nem számít ha nincs.) Ezek után ezt a látogató már a belső felhasználó adatbázisnak is részese lesz.
Nézzük akkor a hook_auth implementációt. A modul neve abcauth lesz:
<?php
function abcauth_auth($username, $pass, $server = NULL) {
global $abcauth_new_user;
if ($pass == 'abc') {
$abcauth_new_user = array(
'email' => 'abc@example.com',
'pass' => 'abc'
);
return TRUE;
}
else {
$abcauth_new_user = FALSE;
return FALSE;
}
}
function abcauth_user($op, &$edit, &$account, $category = NULL) {
global $abcauth_new_user;
switch($op) {
case 'insert':
if ($abcauth_new_user !== FALSE) {
db_query(
"UPDATE {users} SET mail = '%s', pass=MD5('%s') WHERE uid = %d",
$abcauth_new_user['email'],
$abcauth_new_user['pass'],
$account->uid
);
}
break;
}
}
?>
Ez a kód beenged mindenkit aki ’abc’ jelszót adott meg. Éles környezetben természetesen implementálni kell valami normális ellenőrzést, pl. külső adatbázishoz hasonlítás, LDAP vagy valami.
A hook_user implementálására azért volt szükség, hogy az újonnan létrejött felhasználó adatait beállíthassuk.
Sajnos minden felhasználó első belépésekor a rendszer elhasal, és több PHP és SQL hibát is generál. Ráadásul ez az 5-ös széria jelenlegi legfrissebb verziójára, az 5.7-re is igaz.
A hiba javítása már megtörtént, de új verziót még nem adtak ki. Az 5.8-as verziótól (ha majd elkészül) biztosan benne lesz a hiba javítása. Ha addig nem tudunk várni, akkor innen letölthető a hibajavítás:
http://drupal.org/node/165642#comment-689890
A megjegyzéshez csatolt patch-et kell letölteni és ráhúzni a rendszerre. Erre a patch nevű programot lehet használni. UNIX és Linux rendszerek általában tartalmazzák a programot, Windows esetében a UnxUtils-t kell letölteni, abban benne van a patch program:
http://unxutils.sourceforge.net/
Külön köszönöm a drupal.hu support levlista "Zoli" nevű olvasójának, hogy segített megtalálni a hiba javítását.