Felhasználók hitelesítése

cakephpHabá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.

7 thoughts on “Felhasználók hitelesítése

  1. Pingback: WebMánia » Felhasználói jogosultságok kezelése - CakePHP 1. rész

  2. 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.

  3. 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?

  4. 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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.