Yii - Authentification

Le processus de vérification de l'identité d'un utilisateur est appelé authentication. Il utilise généralement un nom d'utilisateur et un mot de passe pour juger si l'utilisateur est celui qu'il prétend.

Pour utiliser le cadre d'authentification Yii, vous devez -

  • Configurez le composant d'application utilisateur.
  • Implémentez l'interface yii \ web \ IdentityInterface.

Le modèle d'application de base est livré avec un système d'authentification intégré. Il utilise le composant d'application utilisateur comme indiqué dans le code suivant -

<?php
   $params = require(__DIR__ . '/params.php');
   $config = [
      'id' => 'basic',
      'basePath' => dirname(__DIR__),
      'bootstrap' => ['log'],
      'components' => [
         'request' => [
            // !!! insert a secret key in the following (if it is empty) - this
               //is required by cookie validation
            'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
         ],
         'cache' => [
            'class' => 'yii\caching\FileCache',
         ],
         'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
         ],
         //other components...
         'db' => require(__DIR__ . '/db.php'),
      ],
      'modules' => [
         'hello' => [
            'class' => 'app\modules\hello\Hello',
         ],
      ],
      'params' => $params,
   ];
   if (YII_ENV_DEV) {
      // configuration adjustments for 'dev' environment
      $config['bootstrap'][] = 'debug';
      $config['modules']['debug'] = [
         'class' => 'yii\debug\Module',
      ];
      $config['bootstrap'][] = 'gii';
      $config['modules']['gii'] = [
         'class' => 'yii\gii\Module',
      ];
   }
   return $config;
?>

Dans la configuration ci-dessus, la classe d'identité de l'utilisateur est configurée pour être app \ models \ User.

La classe d'identité doit implémenter le yii\web\IdentityInterface avec les méthodes suivantes -

  • findIdentity() - Recherche une instance de la classe d'identité à l'aide de l'ID utilisateur spécifié.

  • findIdentityByAccessToken() - Recherche une instance de la classe d'identité à l'aide du jeton d'accès spécifié.

  • getId() - Il renvoie l'ID de l'utilisateur.

  • getAuthKey() - Renvoie une clé utilisée pour vérifier la connexion basée sur les cookies.

  • validateAuthKey() - Implémente la logique de vérification de la clé de connexion basée sur les cookies.

Le modèle User du modèle d'application de base implémente toutes les fonctions ci-dessus. Les données utilisateur sont stockées dans le$users propriété -

<?php
   namespace app\models;
   class User extends \yii\base\Object implements \yii\web\IdentityInterface {
      public $id;
      public $username;
      public $password;
      public $authKey;
      public $accessToken;
      private static $users = [
         '100' => [
            'id' => '100',
            'username' => 'admin',
            'password' => 'admin',
            'authKey' => 'test100key',
            'accessToken' => '100-token',
         ],
         '101' => [
            'id' => '101',
            'username' => 'demo',
            'password' => 'demo',
            'authKey' => 'test101key',
            'accessToken' => '101-token',
         ],
      ];
      /**
      * @inheritdoc
      */
      public static function findIdentity($id) {
         return isset(self::$users[$id]) ? new static(self::$users[$id]) : null;
      }
      /**
      * @inheritdoc
      */
      public static function findIdentityByAccessToken($token, $type = null) {
         foreach (self::$users as $user) {
            if ($user['accessToken'] === $token) {
               return new static($user);
            }
         }
         return null;
      }
      /**
      * Finds user by username
      *
      * @param string $username
      * @return static|null
      */
      public static function findByUsername($username) {
         foreach (self::$users as $user) {
            if (strcasecmp($user['username'], $username) === 0) {
               return new static($user);
            }
         }
         return null;
      }
      /**
      * @inheritdoc
      */
      public function getId() {
         return $this->id;
      }
      /**
      * @inheritdoc
      */
      public function getAuthKey() {
         return $this->authKey;
      }
      /**
      * @inheritdoc
      */
      public function validateAuthKey($authKey) {
         return $this->authKey === $authKey;
      }
      /**
      * Validates password 
      *
      * @param string $password password to validate
      * @return boolean if password provided is valid for current user
      */
      public function validatePassword($password) {
         return $this->password === $password;
      }
   }
?>

Step 1 - Aller à l'URL http://localhost:8080/index.php?r=site/login et connectez-vous au site Web en utilisant admin pour un identifiant et un mot de passe.

Step 2 - Ensuite, ajoutez une nouvelle fonction appelée actionAuth() au SiteController.

public function actionAuth(){
   // the current user identity. Null if the user is not authenticated.
   $identity = Yii::$app->user->identity;
   var_dump($identity);
   // the ID of the current user. Null if the user not authenticated.
   $id = Yii::$app->user->id;
   var_dump($id);
   // whether the current user is a guest (not authenticated)
   $isGuest = Yii::$app->user->isGuest;
   var_dump($isGuest);
}

Step 3 - Tapez l'adresse http://localhost:8080/index.php?r=site/auth dans le navigateur Web, vous verrez les informations détaillées sur admin utilisateur.

Step 4 - Pour vous connecter et vous connecter à un utilisateur, vous pouvez utiliser le code suivant.

public function actionAuth() {
   // whether the current user is a guest (not authenticated)
   var_dump(Yii::$app->user->isGuest);
   // find a user identity with the specified username.
   // note that you may want to check the password if needed
   $identity = User::findByUsername("admin");
   // logs in the user
   Yii::$app->user->login($identity);
   // whether the current user is a guest (not authenticated)
   var_dump(Yii::$app->user->isGuest);
   Yii::$app->user->logout();
   // whether the current user is a guest (not authenticated)
   var_dump(Yii::$app->user->isGuest);
}

Dans un premier temps, nous vérifions si un utilisateur est connecté. Si la valeur renvoie false, puis nous connectons un utilisateur via le Yii::$app → user → login() appelez-le et déconnectez-le en utilisant le Yii::$app → user → logout() méthode.

Step 5 - Aller à l'URL http://localhost:8080/index.php?r=site/auth, vous verrez ce qui suit.

le yii\web\User class déclenche les événements suivants -

  • EVENT_BEFORE_LOGIN- Levé au début de yii \ web \ User :: login ()

  • EVENT_AFTER_LOGIN - Relancé après une connexion réussie

  • EVENT_BEFORE_LOGOUT- Levé au début de yii \ web \ User :: logout ()

  • EVENT_AFTER_LOGOUT - Relancé après une déconnexion réussie