Non poteva mancare, in un framework completo come Yii, un sistema integrato per l'autenticazione e l'autorizzazione degli utenti. La gestione degli utenti viene effettuata mediante il componente user, che ovviamente è precaricato. Mediante l'ausilio di questo componente possiamo quindi effettuare le operazioni di login, logout e per finire il controllo degli accessi.
Mediante questo componente possiamo accedere alle informazioni dell'utente corrente in ogni punto dell'applicazione mediante la seguente sintassi:
Yii::app()->user;
Il framework fornisce uno scheletro di una classe sulla quale basare l'autenticazione. Il sistema fornito è quello classico che si basa su una coppia username / password ma gli stessi autori non escludono la possibilità di utilizzare altri sistemi di autenticazione come LDAP e addirittura Facebook Connect e Twitter auth. La classe dedicata allo scopo si trova ovviamente sotto components. Il nome del file è userIdentity così come il nome della classe che estende CUserIdentity
.
Il codice che riporto sotto va implementato nel file userIdentity.
private $_id;
public function authenticate()
{
$pwd = md5($_POST['LoginForm']['password']);
$user = $_POST['LoginForm']['username'];
$record =User::model()->findByAttributes(array('user'=>$user,'password'=>$pwd));
if($record===null){
$this->errorCode=self::ERROR_USERNAME_INVALID;
$this->errorCode=self::ERROR_PASSWORD_INVALID;
}else{
$this->_id=$record->id;
$this->errorCode=self::ERROR_NONE;
}
return !$this->errorCode;
}
public function getId() {
return $this->_id;
}
}
Il codice riportato sopra è a puro titolo di esempio e non è adatto ad essere implementato in una web application reale. Il suo scopo è solo mostrarvi un minimo di codice con il quale effettuare una autenticazione sfruttando un database.
Il codice è abbastanza semplice. Effettuiamo la ricerca della coppia user password, opportunamente codificata in md5, sulla tabella user mediante il suo model. Per farlo utilizziamo il metodo findByAttributes
che, come suggerisce il nome, permette di effettuare una ricerca in base a dei campi di una tabella. Il metodo consente anche di passare come secondo e terzo parametro una condizione, che viene applicata alla query, e dei parametri. In caso la coppia venga trovata, il metodo restituisce true e tutte le informazioni dell'utente sono contenute nella classe.
Vi ricordo che il controller user generato dal modulo gii, non prevede l'utilizzo della funzione md5 per il campo password.
Se ricordate, quando abbiamo parlato dei models, abbiamo posto evidenza sul metodo rules
. Questo metodo restituiva un array associativo, nel quale erano dichiarati i filtri di accesso alle varie action del controller. Nel metodo filter era indicato come sistema di controllo :"accessControl". I due metodi, o per meglio dire gli array che restituiscono, così configurati, consentono di effettuare un controllo sulla tipologia di utente.