Habár a cake szakácskönyve elég részletesen leírja, hogy hogyan kell egy usereket hitelesítő részt megírni 1.2-es cake esetén, de még mindig időről időre keresgélnem kelett amikor egy új projekthez szerettem volna ezt a funkciót megírni. Végül fogtam (és az egyébként jó ideje vázlatként várakozó postot) és megírtam. Íme.
A CakePHP keretrendszer Auth komponense sok-sok részletben segítségünkre siet ha szeretnénk az alkalmazásunkba beépíteni egy felhasználók bejelentkezését, regisztrációját kezelő részt.
Először is a vezérlőkben be kell tölteni az Auth komponens ahhoz, hogy használni tudjuk. Legkézenfekvőbb az app_controller.php
fájlból behívni, mert így az összes vezérlőben elérhetővé válnak a funkciók.
<?php class AppController extends Controller { var $components = array('Auth'); } ?>
A következő lépésként a két leggyakrabban használt eljárást a be és kijelentkezést kell definiálnunk. Kézenfekvő, hogy az ehhez szükséges két metódust a User vezérlőben hozzuk létre.
<?php class UsersController extends AppController { var $name = 'Users'; function login() { } function logout() { $this->redirect($this->Auth->logout()); } } ?>
A login
függvény üresen maradhat, mivel az Auth komponens automatikusan megcsinál mindent amit csak szereténk. a logout
metódus sincsen túlbonyolítva, egyetlen dolgot adunk meg, hogy kijelentkezés esetén használja az Auth komponens logout metódusát.
A login metódushoz tartozó nézetet létre kell hoznunk a /app/views/users/login.ctp fájlban.
<?php if ($session->check('Message.auth')) $session->flash('auth'); print $form->create('User', array('action' => 'login')); print $form->input('username'); print $form->input('password'); print $form->end('Login'); ?>
Ezzel a nézettel kaptunk egy egyszerű bejelétkezéshez használható formot.
Az Auth komponens alapértelmezés szerint azt feltételezi, hogy a felhasználók a users táblában csücsülnek, a bejelentkezési nevük a username, a jelszavuk pedig a password nevű mezőben van. Ha az alkalmazásodra ez igaz, akkor készen is vagy hála a CakePHP konvencióinak. Ha nem ez a helyzet akkor még be kell állítanunk a megfelelő értékeket a users_controller.php
fájl beforeFilter()
metódusában.
class UsersController extends Controller { var $helpers = array('Html', 'Form', 'Javascript', 'Ajax'); var $components = array('Auth'); function beforeFilter(){ //auth komponensben használt mezőnevek $this->Auth->fields = array( 'username' => 'email', 'password' => 'pass' ); } }
Persze ebben az esetben a nézet fájlban is ezeket a mezőneveket kell használnunk a formban.
Update 2009.05.23: A login.ctp fájlban nem csak az inputok nevét, hanem a jelszó mező esetében annak típusát is meg kell változtatni. A jelszó automatikus titkosítása enélkül is megtörténik ugyan, és a be tudunk lépni, de jobb ha a begépelt jelszó nem jelenik meg a képernyőn.
<?php if($session->check('Message.auth')) $session->flash('auth'); print $form->create('User', array('action' => 'login')); print $form->input('email'); print $form->input('pass', array('type' => 'password')); print $form->end('Login'); ?>
Ezeken felül még szükségünk lesz arra, hogy valahogyan megadjuk, hogy az alkalmazásunk mely részei érhetőek el hitelesítés / bejelentkezés nélkül. A login egyértelműen ilyen, ezt nem kell megemlítenünk, a komponens magától tudja, hogy ezt hitelesítés nélkül fogjuk meghívni. Ha ezen felül szeretnénk még elérhetővé tenni bizonyos tartalmakat / szolgáltatásokat akkor ezt az Auth komponens allow()
metódusával tehetjük meg. Ha például azt szeretnénk, hogy minden page illetve a users vezérlő register és activate_account metódusai legyenek hitelesítés nélkül is elérhetőek akkor a következőket kell tennünk.
app_controller.php
function beforeFilter(){ $this->Auth->allow('display'); }
users_controller.php
function beforeFilter() { $this->Auth->allow('register', 'activate_account'); }
Ezen felül még annyit kell tudnunk, hogy az Auth komponens azt feltételezi, hogy a jelszavakat md5-tel tároljuk az adatbázisban. Amennyiben nem ez a helyzet,, akkor a következő utasítást kell használnunk:
Security::setHash('md5'); // vagy sha1 vagy sha256.
Arra figyelnünk kell, hogy a komponens csak azt a mezőt fogja automatikusan titkosítani ami az adatbázisban a jelszót tárolja. Ha például kétszer kérjük a jelszó beírását, akkor a második jelszó titkosítását maguknak kell elvégezni.
function register() { if(!empty($this->data)){ if ($this->data['User']['pass'] == $this->Auth->password($this->data['User']['pass_confirm'])) { //a két jelszó egyezik } } }
Update 2009.05.23: Ne feledkezzünk meg arról, hogy a jelszó sózás után alapértelmezett esetben sha1-el titkosítva fog tárolásra kerülni. Ezért a jelszó mezőt megfelelően hosszúra kell választanunk az adatbázisban.
Pingback:WebMánia » Felhasználói jogosultságok kezelése - CakePHP 1. rész
Hali,
Nagyon jók lettek az új cakephp-s cikkek. Várjuk a további cikkeket!
Egy kérdés vetődött fel bennem az Auth-os témában. A beépitett login() , amikor ugye teljesen üres , elvégzi-e a belépő form adatainak ellenőrzését? Eddig ugye a hasznos Sanitize-t használtuk/tam erre.
Szerintem nem, a kódot túrva is úgy tűnik, hogy nem, ugyanakkor nyilvánvalóan escapel ha tesztelgeted egy kicsit. Ha valami pontosabbra jutok jelentkezem.
Rendben, köszi a segitséget.
Tegnap sokat szivtam vele, hogy vmiért nem egyeztek belépésnél a hashek, mivel a Cake a jelszót még besózza a Security.salt értékével a core.phpból. Akkor gond ez, ha a db-ben nincsenek a jelszók besózva. Én megoldásnak a Security.salt értékének törlését találtam meg az éterben.
Esetleg vmi más megoldás?
Persze van, a salt módosítás nem egy jó ötlet. http://book.cakephp.org/hu/view/566/Change-Hash-Function
Gondoltam, hogy máshol is használva van a sózás, ezért nem célratörő törölni.
A saját hashPasswords() metódust hova kell helyezni? A controllerbe vagy a User modeljébe? Üresen kell hagyni vagy felül kell irni az eredetit némi módositással?
Köszi
Nézz körül a szakácskönyvben. Szerintem ott mindez le van írva.