Külső felhasználó adatbázis használata Drupal 6 alatt

Az előző cikk folytatásaként, most bemutatom, hogyan lehet a Drupal 6 alatt külső adatbázissal végezni a felhasználó autentikációt.

A hook_auth eltünt, helyette a már megszokott hook_form_alter-t kell használnunk, illetve van egy segédfüggvény (nem hook!) amit használhatunk, a user_external_login_register.

A feladatra többféle helyes megoldás adható, én itt a hook_auth funkcionalitását fogom szimulálni. Ahhoz, hogy ezt megtegyük, meg kell ismerni, hogyan áll össze a drupal core felhasználó autentikációja:

Két form létezik, amivel be lehet lépni, a user_login és a user_login_block. Mindkettőnek, három, azaz 3 darab #authenticate metódusa van, ami annyit jelent, hogy mind a három függvény hiba nélkül kell lefusson. Ha valamelyik hibát jelez, akkor a felhasználót nem lehet beengedni.

- user_login_name_validate (modules/user/user.module:1285): azt ellenőrzi, hogy az adott felhasználónév nincs-e tiltólistán.
- user_login_authenticate_validate (modules/user/user.module:1302): azt ellenőrzi, hogy a felhasználónév-jelszó páros benne van-e a users táblában. Ha benne van, akkor létrehozza a $user objektumot a tábla adatainak megfelelően.
- user_login_final_validate (modules/user/user.module:1310): mindössze annyit ellenőriz, hogy $user->uid nem 0-e. Ha 0 hibát jelez.

Ha a felhasználó helyes felhasználónév-jelszó párost adott meg, akkor a user_login_authenticate_validate létrehozza a $user objektumot, és többek között az uid értékét is beállítja. Ekkor a user_login_final_validate nem jelez hibát.

Namármost, ha szimulálni akarjuk a hook_auth működését, annyit kell tennünk, hogy a user_login_finval_validate metódus elé beteszünk még egy másik authenticate metódust, ami ellenőrzi a felhasználónév-jelszó párost a külső adatbázis alapján is. Ha mi helyesnek találjuk ezt a párost, akkor létre kell hozni az adatbázisban a felhasználót, és be kell léptetni. Hogy ne kelljen kézzel matatni a users táblában, a Drupal ad egy függvényt nekünk ami hajszál pontosan ezt csinálja. Ez a függvény a user_external_login_register. Mindössze két paramétere van, az egyik a felhasználónév, a másik a modul név ami beengedte a user-t.

Ezek után nem marad más hátra, mint a kód:

<?php
function abcauth_form_alter(&$form, $form_state, $form_id) {
  global
$user;
  if (
$form_id == 'user_login' or $form_id == 'user_login_block') {
   
$form['#validate'] = array (
     
0 => 'user_login_name_validate',
     
1 => 'abcauth_validate',
     
2 => 'user_login_authenticate_validate',
     
3 => 'user_login_final_validate',
    );
  }
}

function
abcauth_validate ($form, &$form_state) {
  global
$abcauth_new_user;
 
// ide jön a valódi autentikáció
 
if ($form_state['values']['pass'] == 'abc') {
   
user_external_login_register($form_state['values']['name'], 'abcauth');
   
$abcauth_new_user = array(
     
'name' => $form_state['values']['name'],
     
'pass' => 'abc',
     
'mail' => 'abc@example.com',
    );
  }
  else {
   
$abcauth_new_user = 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 = '-' WHERE uid = %d",
         
$abcauth_new_user['email'],
         
$account->uid
       
);
      }
      break;
  }
}
?>

Említettem, hogy Drupal 6 alatt is vannak hibák. Szerencsére itt nem mindig. A fenti megoldás a profile module bekapcsolt állapotban, sajnos nem fér meg egymás mellet. SQL és egyéb szörnyű hibákat generál. Erre még nem találtam megoldást, ha találok akkor frissítem a post-ot (ha nem felejtem el).

A webfejlesztés nagy "megmondásai"

Webisztán közöl egy linket, ahol összegyűjtötték a webfejlesztés "törvényeit": itt, angolul

Gondoltam lefordítom a jobbakat, szigorúan szabadon! Hátakkor lássuk:

Brook törvénye
Egy késésben lévő projektnél új munkaerő bevonása csak tovább késlelteti azt.

Parkinson törvénye
Minden munka legalább addig tart, amennyi idő van rá.

Hoare törvénye
Ez nagyon igaz:
Minden nagy probléma, valójában egy jól elrejtett apró probléma.

Lister törvénye
A szűkös határidőtől senki nem fog gyorsabban gondolkodni.

Pareto elv
Én ezt így ismertem:
80/20 szabály: A szükséges funkciónalitás 20%-ának elkészítésével lefedhető az igények 80%-a.

Tesler komplexitás törvénye
Minden feladat csak egy adott mértékig egyszerűsíthető. Azon túl már csak a súlypont változik.

Occam törvénye
A lehetséges magyarázatok közül mindig az igaz, amelyiknél a legkevesebb a feltételezés.

Hofstadter törvénye
Egy feladat elvégzéséhez szükséges idő mindig tovább tart az előre eltervezettnél. Akkor is, ha előzetesen figyelembe vetted ezt a törvényt is.

90-90 törvény
Ezt is máshogy ismertem:
A funkciók 90% százalékának elkészítéséhez szükséges az idő 90%-a. A maradék 90%-hoz, újabb 90% idő kell.

Hartree törvénye
Én kb így hallottam:
Egy program mindig két hét múlva lesz kész.

(Ez azért vicces mert a mostani projektjeimre ez teljes mértékben igaz :))

Jakob törvénye
Az interneten böngészők az idejük nagy részét nem a te oldaladon töltik. Ez azt jelenti, hogy azt szeretnék, hogy a te oldalad úgy működjön mint a többi, amit ismernek.

Fisher törvénye
Minél jobban adaptálódott egy szervezet, annál kevésbé adaptív.

Hát ebben bizony semmi érdekes nincs, ezt eddig is tudtuk :)

Clarke második törvénye
A lehetőségeink határait csak akkor fedezhetjük fel, ha néha átlépjük azt.

Na végülis mindet "lefordítottam". Biztosan máshol másképpen idézik ezeket a mondásokat, nekem ezt jelentik.

Külső felhasználó adatbázis használata Drupal 5 alatt

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.

Devel modul

Ez a cikk a Legjobb Drupal modulok sorozat következő része.

Mindenki aki Drupal-al foglalkozik, az ismeri a Devel modult. Ez a bejegyzés a föld népességéből annak a három embernek szól, akik esetleg nem ismernék ezt a modult. :)

Használata



  • Letöltés itt: Devel.

  • Modul bekapcsolása az admin/build/modules oldalon.

  • A modul által publikált blokkok bekapcsolása az admin/build/blocks oldalon.

Development block

Attól függően, hogy az 5-ös vagy 6-os verziót használjuk, 2 vagy 3 darab blokkot publikál. A lényeg, amely mindkét verzióban benne van, a Development blokkban található. A blokk linkek halma, amelyek magukért beszélnek:


  • Empty cache: gyorsítótár ürítés egy gombnyomással. Modul fejlesztésnél hasznos, amikor éppen a hook_menu implementálásával bénázunk. Most, hogy a 6-os Drupal-ban teljesen felforgatták a menürendert, ez bizony aktuális lehet.

  • Enable Theme developer: Aki még nem tette, annak kötelező kipróbálni a Theme Developer-t Drupal 6 alatt.

  • Legújabb projektem fejlesztésekor pl. a Run Cron és a Variable editor gombot nyomogattam veszettül. Egy jó kis játék készül, majd beszámolok itt!

  • A többi funkció is magától értetődik és hasznosak, részleteszésük szerintem felesleges.

Van még két másik block is: az Execute PHP blokkban egy többsoros szövegmező van, amiben közvetlenül futtathatuk PHP kódot. Ez változó átállításra (variable_set) és PHP változók kiíratására (kvázi, debug) használható. A Language switcher blokk, csak D6 alatt elérhető, és a nyelv azonnali megváltoztatására szolgál, természetesen.

Egyéb Devel modulok

A csomag tartalmaz még néhány kiegészítő modult is:

  • Devel Generate - teszteléshez hasznos, automatikusan generálhatunk felhasználókat, node-okat és taxonomy term-eket, azaz kategória cimkéket.
  • Devel Node Access - Részletes node startisztikát jelenít meg minden node alatt.
  • Macro - Űrlap kitöltéseket lehet vele felvenni, majd visszajátszani. Ez is biztos szuper.
  • Bevallom én még csak a központi Devel modult használtam, illetve játszottam a Theme developer-rel, de biztos vannak esetek, amikor a többi funkció is jól jön.

Letöltés: Devel

Oldalak

Feliratkozás Prunk-Éger Edgár  RSS csatornájára