Yii - Autenticación

El proceso de verificación de la identidad de un usuario se denomina authentication. Por lo general, utiliza un nombre de usuario y una contraseña para juzgar si el usuario es uno de los que afirma.

Para usar el marco de autenticación de Yii, necesita:

  • Configure el componente de la aplicación de usuario.
  • Implemente la interfaz yii \ web \ IdentityInterface.

La plantilla de aplicación básica viene con un sistema de autenticación integrado. Utiliza el componente de la aplicación de usuario como se muestra en el siguiente código:

<?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;
?>

En la configuración anterior, la clase de identidad para el usuario está configurada para ser app \ models \ User.

La clase de identidad debe implementar el yii\web\IdentityInterface con los siguientes métodos:

  • findIdentity() : Busca una instancia de la clase de identidad utilizando el ID de usuario especificado.

  • findIdentityByAccessToken() : Busca una instancia de la clase de identidad utilizando el token de acceso especificado.

  • getId() - Devuelve el ID del usuario.

  • getAuthKey() - Devuelve una clave utilizada para verificar el inicio de sesión basado en cookies.

  • validateAuthKey() - Implementa la lógica para verificar la clave de inicio de sesión basada en cookies.

El modelo de usuario de la plantilla de aplicación básica implementa todas las funciones anteriores. Los datos del usuario se almacenan en el$users propiedad -

<?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 - Ir a la URL http://localhost:8080/index.php?r=site/login e inicie sesión en el sitio web utilizando admin como nombre de usuario y contraseña.

Step 2 - Luego, agregue una nueva función llamada actionAuth() al 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 - Escriba la dirección http://localhost:8080/index.php?r=site/auth en el navegador web, verá la información detallada sobre admin usuario.

Step 4 - Para iniciar sesión y logou, un usuario puede utilizar el siguiente código.

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);
}

Al principio, verificamos si un usuario está conectado. Si el valor regresa false, luego iniciamos sesión como usuario a través del Yii::$app → user → login() llamar y cerrar la sesión con el Yii::$app → user → logout() método.

Step 5 - Ir a la URL http://localhost:8080/index.php?r=site/auth, verá lo siguiente.

los yii\web\User la clase genera los siguientes eventos:

  • EVENT_BEFORE_LOGIN- Criado al principio de yii \ web \ User :: login ()

  • EVENT_AFTER_LOGIN - Criado después de un inicio de sesión exitoso

  • EVENT_BEFORE_LOGOUT- Criado al principio de yii \ web \ User :: logout ()

  • EVENT_AFTER_LOGOUT - Criado después de un cierre de sesión exitoso