Felhasználók hitelesítése
cakephp, fejlesztés, hogyan
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.
Ez a bejegyzés rrd billentyűzetéből potyogott ki 2009 május 21. napján 12:00:20-kor. Eddig 2,117 olvasást ért meg. A visszajelzéseket nyomonkövetheted ezzel az RSS feed-el. Véleményt nyilváníthatsz, vagy trackbackolhatsz a saját oldaladon.
JólMegMondjad!
7 vélemény
-
WebMánia » Felhasználói jogosultságok kezelése - CakePHP 1. rész
2009 május 25. 12:02:48[...] WebMánia « Felhasználók hitelesítése [...]
-
Zsolt
2009 június 9. 20:07:16Hali,
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.
-
rrd
2009 június 10. 09:25:31Szerintem 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.
-
Zsolt
2009 június 10. 16:54:22Rendben, 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?
-
rrd
2009 június 10. 17:17:15Persze van, a salt módosítás nem egy jó ötlet. http://book.cakephp.org/hu/view/566/Change-Hash-Function
-
Zsolt
2009 június 10. 18:02:14Gondoltam, 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
-
rrd
2009 június 10. 18:04:51Nézz körül a szakácskönyvben. Szerintem ott mindez le van írva.



