5.2 Autenticazione

The original text for this section has changed since it was translated. Please help resolve this difference. You can:

More information about translations

I sistemi di autenticazione degli utenti sono comuni a molte web applications. in CakePHP ci sono diversi sistemi per gestire l'autenticazione, ognuno con differenti opzioni. Principalmente, il componente Authentication verifica se un utente ha effettuato l'accesso al sito. Se si, il componente permette a quell'utente di accedere all'intero sito. Questo componente può essere utilizzato insieme al componente ACL (Access Control Lists) per definire diversi livelli di accesso al sito. In questo modo un utente potrà accedere come utente generico, mentre un altro accederà come amministratore e avrà accesso a sezioni protette del sito.

Il componente AuthComponent di CakePHP serve per creare un sistema di questo tipo in modo semplice e veloce. Diamo un'occhiata a come funziona.

Come tuti i componenti, per usarlo devi dichiararlo aggiungendo 'Auth' nella lista dei componenti del tuo controller:

class FooController extends AppController {
    var $components = array('Auth');
  1. class FooController extends AppController {
  2. var $components = array('Auth');

Oppure puoi applicarlo a tutti i controllers, semplicemente includendolo nell' 'AppController:

class AppController extends Controller {
    var $components = array('Auth');
  1. class AppController extends Controller {
  2. var $components = array('Auth');

Ci sono alcune convenzioni da rispettare per utilizzare AuthComponent. Come impostazione predefinita, AuthComponent richiede una tabella chiamata 'users' con dei campi chiamati 'username' e 'password'.

La puoi creare usando questa query SQL:

CREATE TABLE users (
    id integer auto_increment,
    username char(50),
    password char(50),
    PRIMARY KEY (id)
);
  1. CREATE TABLE users (
  2. id integer auto_increment,
  3. username char(50),
  4. password char(50),
  5. PRIMARY KEY (id)
  6. );

Per maggior sicurezza, AuthComponent cripta automaticamente tutti i dati che gli vengono inviati da campi di form che si chiamano 'password'. Per esempio, se crei un nuovo utente, il valore memorizzato in $data['User']['password] sarà criptato, e non puoi risalire alla stringa originale inviata.

Questo potrebbe metterti in difficoltà nel caso che tu ti voglia assicurare che sia stata inserita una password abbastanza complessa. Per esempio potresti volerti assicurare che i tuoi utenti abbiano password più lunghe di 8 caratteri.

Un modo di aggirare questo problema è creare un nuovo campo nel form e chiamarlo in modo diverso rispetto al nome del campo password del modello. Quindi puoi eseguire la validazione del dato inviato, criptare manualmente la password e salvarla nel tuo database impostando correttamente il modello.

Quando crei la tua tabela degli utenti, tieni sempre a mente questa caratteristica della cifratura automatica delle password. Assicurati che il campo password nel tuo database sia abbastanza capiente da poter memorizzare stringhe piuttosto lunghe (40 caratteri per SHAI, ad esempio).

Per un semplice sistema di autenticazione, ti servono solo due azioni nel tuo controller:

class UsersController extends AppController {

    var $name = 'Users';    

    function login() {
    }

    function logout() {
        $this->redirect($this->Auth->logout());
    }
}
  1. class UsersController extends AppController {
  2. var $name = 'Users';
  3. function login() {
  4. }
  5. function logout() {
  6. $this->redirect($this->Auth->logout());
  7. }
  8. }

E ti serve solo una view, per la pagina di login (salvala in app/views/users/login.ctp). Questo esempio presuppone che tu utilizzi anche l'helper Form:

<?php
    if  ($session->check('Message.auth')) $session->flash('auth');
    echo $form->create('User', array('action' => 'login'));
    echo $form->input('username');
    echo $form->input('password');
    echo $form->end('Login');
?>
  1. <?php
  2. if ($session->check('Message.auth')) $session->flash('auth');
  3. echo $form->create('User', array('action' => 'login'));
  4. echo $form->input('username');
  5. echo $form->input('password');
  6. echo $form->end('Login');
  7. ?>

Questa view crea un semplice form di login con i campi per inserire username e password. Quando invii il form, AuthComponent fa il resto per te. Tutte le notifiche generate da AuthComponent vengono visualizzate tramite un flash session.

Se non utilizzi $form->create, assicurati che i campi User.username e User.password siano configurati correttamente.

Che tu ci creda o no, hai finito! Come vedi, realizzare un sistema di autenticazione basato su database con AuthComponent è molto semplice. Ma ci sono molte altre cose che puoi ancora fare. Diamo un'occhiata ad alcuni utilizzi avanzati di questo componente.

Se vuoi modificare il comportamento prestabilito del componente, lo puoi fare creando un metodo beforeFilter() nel controller, e al suo interno richiamare alcuni metodi propri del compnente, o impostare le variabili di configurazione.

class UsersController extends AppController {
    var $component = array('Auth');

    function beforeFilter() {
        ....
    }
}
  1. class UsersController extends AppController {
  2. var $component = array('Auth');
  3. function beforeFilter() {
  4. ....
  5. }
  6. }

L'ultimo passo è impostare il layout per visualizzare i mesaggi di errore che il componente genera. In questo modo li visualizzi come normali messaggi flash:

<?php
	if ($session->check('Message.flash')) {
		$session->flash();
	}
	if ($session->check('Message.auth')) {
		$session->flash('auth');
	}
?>
  1. <?php
  2. if ($session->check('Message.flash')) {
  3. $session->flash();
  4. }
  5. if ($session->check('Message.auth')) {
  6. $session->flash('auth');
  7. }
  8. ?>

E ora vediamo i metodi che AuthComponent mtte a disposizione.