
Il modello di autenticazione di Yii Framework
In questo nuovo post, cercherò di introdurvi le basi di un’ argomento fondamentale per la comprensione del modello di autenticazione di uno dei migliori framework PHP in circolazione: Yii Framework.
Centrale nel modello di autenticazione di Yii frame work è un componente dell’applicazione, chiamato User, il quale implementa l’interfaccia del Framework, denominata IWebUser. Invece, la classe specifica per l’ implementazione predefinita di questo oggetto è la classe del framework, CWebUser.
Questo componente User incapsula tutte le informazioni sull’identità dell’utente corrente dell’applicazione. Questo componente viene configurato per noi come parte del codice auto-generato dell’applicazione nel momento in cui generiamo la nostra applicazione.
La sua configurazione può essere settata nel file di configurazione principale dell’applicazione protected/config/main.php , e specificatamente nel seguente punto:
‘user’=>array(
// enable cookie-based authentication
‘allowAutoLogin’=>true,
),
In tal modo si è configurato User come un componente dell’applicazione, quindi con la chiave “user“, si può accedere in qualsiasi luogo in tutta la nostra applicazione utilizzando Yli: app() – >user.
Vi invito, inoltre a notare che la proprietà della classe, allowAutoLogin, è impostata a true. Questa proprietà di default è impostata a false, tuttavia l’impostarla a true consente all’utente di memorizzare le informazioni nei cookie del browser in modo persistente. Questi dati vengono poi utilizzati per autenticare automaticamente l’utente alla visita successiva.
Quindi questa proprietà è ciò che ci permetterà di avere una casella di controllo di memorizzazione dei dati nella schermata di Login, in modo che, se l’utente sceglie di selezionarla, nelle successive visite al sito può essere eseguito automaticamente il login.
Il modello di Autentificazione di Yii framework definisce un’entità separata di autenticazione interna ad esso, che implementa l’effettiva logica di autenticazione. Questo è una classe di UserIdentity, che l’ implementa l’interfaccia del framework IUserIdentity.
Uno dei ruoli principali di questa classe è quello di consentire l’ incapsulamento della logica di autenticazione per consentire semplicemente diverse implementazioni.
In base ai requisiti dell’applicazione, potremmo avere la necessità di convalidare un nome utente e una password contro valori memorizzati in un Database, o consentire agli utenti di accedere con le loro credenziali OpenID o integrare un approccio LDAP esistente in azienda. Questa separazione della logica che è specifico per l’approccio di autenticazione dal resto dell’applicazione di accesso vi consente di passare facilmente a tali implementazioni. La classe di UserIdentity fornisce questa separazione.
Appena generata la nostra applicazione, il file della classe di UserIdentity è stato creato automaticamente nel seguente percorso protected/component/UserIdentity.php.
Tale Classe estende la classe di Yii Framework, CUserIdentity, che è una classe base per implementazioni dell’autenticazione che utilizzano un nome utente e una password.
Diamo un’occhiata al codice che è stato generato per questa classe:
<?php
class UserIdentity extends CUserIdentity
{
public function authenticate()
{
$users=array(
// username => password
‘demo’=>’demo’,
‘https://www.giovannimasucci.it/wp-content/uploads/2020/06/segni-distintivi-polizia-scaled-1.jpg’=>’https://www.giovannimasucci.it/wp-content/uploads/2020/06/segni-distintivi-polizia-scaled-1.jpg’,
);
if(!isset($users[$this->username]))
$this->errorCode=self::ERROR_USERNAME_INVALID;
else if($users[$this->username]!==$this->password)
$this->errorCode=self::ERROR_PASSWORD_INVALID;
else
$this->errorCode=self::ERROR_NONE;
return !$this->errorCode;
}
}
La maggior parte del codice da sviluppare nella definizione di una classe di UserIdentity è l’attuazione dell’autenticazione.
Questo è il motivo per cui è qui specificato il codice fondamentale per l’approccio di autenticazione.
Questa applicazione utilizza semplicemente un’autenticazione predefinita username/password di demo/demo e https://www.giovannimasucci.it/wp-content/uploads/2020/06/segni-distintivi-polizia-scaled-1.jpg/https://www.giovannimasucci.it/wp-content/uploads/2020/06/segni-distintivi-polizia-scaled-1.jpg. Essa controlla semplicemente questi valori contro il nome utente e la password inseriti dall’utente, che siano corrispondenti alle proprietà della classe (proprietà definite nella super classe, CUserIdentity) e se non corrispondono, stabilirà e restituire un codice di errore appropriato.
Al fine di capire al meglio in che modo questo pezzo viene montato in tutto il processo di autenticazione del framework, esaminiamo la logica a partire con il form di accesso.
A tal proposito vi propongo di connettervi alla pagina di login della vostra applicazione: http://localhost/YiiApp/index. Noterete che l’applicazione visualizzerà un semplice modulo che consente l’ingresso di un nome utente, una password e una casella opzionale per memorizzare i dati, funzionalità che abbiamo discusso prima. L’invio di questo modulo invoca la logica contenuta nella SiteController: il metodo actionLogin().
Il processo inizia con l’impostazione degli attributi di classe del modulo classe modello, LoginForm, della forma valori presentati. Quindi viene chiamato Il metodo LoginForm- >validate(), il quale convalida questi valori di attributo in base alle regole definite nelle regole. Questo metodo è definito come segue:
public function rules()
{
return array(
// username and password are required
array(‘username, password’, ‘required’),
// rememberMe needs to be a boolean
array(‘rememberMe’, ‘boolean’),
// password needs to be authenticated
array(‘password’, ‘authenticate’),
);
}
L’ultima di queste regole prevede che l’attributo password essere convalidati utilizzando il metodo personalizzato autenticate(), che viene anche definito nella LoginForm classe come segue:
public function authenticate($attribute,$params)
{
$this->_identity=new UserIdentity($this->username,$this- >password);
if(!$this->_identity->authenticate())
$this->addError(‘password’,’Incorrect username or password.’);
}
Continuando a seguire il processo, la convalida password avviene entrando in LoginForm che chiama il metodo authenticate() all’interno della stessa classe. Questo metodo crea una nuova istanza della classe UserIdentity di autenticazione utilizzata, in questo caso è /protected/ component/UserIdentity.php, e quindi chiama la sua autenticazione.
Quindi chiama il metodo UserIdentity: autenticate() il codice è il seguente:
public function authenticate($attribute,$params)
{
if(!$this->hasErrors()) // we only want to authenticate when no input errors
{
$identity=new UserIdentity($this->username,$this->password);
$identity->authenticate();
switch($identity->errorCode)
{
case UserIdentity::ERROR_NONE:
$duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
Yii::app()->user->login($identity,$duration);
break;
case UserIdentity::ERROR_USERNAME_INVALID:
$this->addError(‘username’,’Username is incorrect.’);
break;
default: // UserIdentity::ERROR_PASSWORD_INVALID
$this->addError(‘password’,’Password is incorrect.’);
break;
}
}
}
Tutto questo codice viene implementato per utilizzare il nome utente e la password e per eseguire la sua autenticazione. In questa implementazione, fintanto che la combinazione nome utente/password è demo/demo o https://www.giovannimasucci.it/wp-content/uploads/2020/06/segni-distintivi-polizia-scaled-1.jpg/https://www.giovannimasucci.it/wp-content/uploads/2020/06/segni-distintivi-polizia-scaled-1.jpg, il metodo restituirà true. Siccome l’autenticazione tramite il login è avvenuto con successo avendo avuto esito, viene chiamata dall’applicazione il componente User .
Come si è detto, per impostazione predefinita, l’applicazione web è configurata per l’utilizzo della classe del YII Framework, CWebuser come componente User dell’applicazione. Il Suo metodo login() prende in una classe di UserIdentity un’ eventuale parametro di durata utilizzato per impostare il tempo di durata del cookie del browser. Nel codice sopra riportato, potete vedere che questa è di 30 giorni se la casella è stato selezionata è il LoginForm eseguito. Se non si supera la durata, l’opzione è impostata su 0. Un valore pari a zero indica nessun cookie.
Il metodo di accesso prende le informazioni contenute nella classe di UserIdentity e lo salva nella memoria permanente per tutta la durata della sessione utente. Al termine di tutto questo processo, la convalida su LoginForm inizialmente chiamati dalla nostra classe SiteController restituisce true, che indica che il login è avvenuto con successo. A questo punto, la classe SiteController quindi reindirizza il valore URL in Yii: app() – >utente- >returnUrl.
Bene a questo punto arrivati, spero che il modelle di autenticazione base di Yii Framework, vi sia molto più chiaro e possa servirvi da base per le vostre considerazioni e implementazioni personalizzate.
Se avete bisogno per vostre esigenze progettuali di una consulenza per capire come modificarlo per connettervi ad una vostro Database, LDAP e altri sistemi di autenticazione utenti, potete chiedere una consulenza tecnica al mio indirizzo di posta info@giovannimasucci.it e come sempre sarò lieto di darvi il mio parere ed eventuali chiarimenti in merito all’argomento trattato.
Anche oggi, vi saluto calorosamente e ringrazio di cuore chi mi ha seguito nella trattazione di questo argomento, alla prossima 🙂
Giovanni Masucci