Yii - Authentifizierung

Der Prozess zum Überprüfen der Identität eines Benutzers wird aufgerufen authentication. In der Regel werden ein Benutzername und ein Passwort verwendet, um zu beurteilen, ob der Benutzer einer ist, für den er sich ausgibt.

Um das Yii-Authentifizierungsframework zu verwenden, müssen Sie -

  • Konfigurieren Sie die Benutzeranwendungskomponente.
  • Implementieren Sie die Schnittstelle yii \ web \ IdentityInterface.

Die grundlegende Anwendungsvorlage enthält ein integriertes Authentifizierungssystem. Es verwendet die Benutzeranwendungskomponente wie im folgenden Code gezeigt -

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

In der obigen Konfiguration ist die Identitätsklasse für den Benutzer als app \ models \ User konfiguriert.

Die Identitätsklasse muss das implementieren yii\web\IdentityInterface mit den folgenden Methoden -

  • findIdentity() - Sucht anhand der angegebenen Benutzer-ID nach einer Instanz der Identitätsklasse.

  • findIdentityByAccessToken() - Sucht mit dem angegebenen Zugriffstoken nach einer Instanz der Identitätsklasse.

  • getId() - Es gibt die ID des Benutzers zurück.

  • getAuthKey() - Gibt einen Schlüssel zurück, mit dem die Cookie-basierte Anmeldung überprüft wird.

  • validateAuthKey() - Implementiert die Logik zum Überprüfen des Cookie-basierten Anmeldeschlüssels.

Das Benutzermodell aus der grundlegenden Anwendungsvorlage implementiert alle oben genannten Funktionen. Benutzerdaten werden in der gespeichert$users Eigentum -

<?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 - Gehen Sie zur URL http://localhost:8080/index.php?r=site/login und melden Sie sich mit admin auf der Website an, um sich anzumelden und ein Passwort einzugeben.

Step 2 - Fügen Sie dann eine neue Funktion mit dem Namen hinzu actionAuth() an den 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 - Geben Sie die Adresse ein http://localhost:8080/index.php?r=site/auth Im Webbrowser sehen Sie die detaillierten Informationen zu admin Nutzer.

Step 4 - Um sich anzumelden und anzumelden, können Sie den folgenden Code verwenden.

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

Zuerst prüfen wir, ob ein Benutzer angemeldet ist. Wenn der Wert zurückgegeben wird false, dann melden wir einen Benutzer über die Yii::$app → user → login() Rufen Sie an und melden Sie ihn mit dem ab Yii::$app → user → logout() Methode.

Step 5 - Gehen Sie zur URL http://localhost:8080/index.php?r=site/authsehen Sie folgendes.

Das yii\web\User Klasse löst die folgenden Ereignisse aus -

  • EVENT_BEFORE_LOGIN- Wird am Anfang von yii \ web \ User :: login () ausgelöst.

  • EVENT_AFTER_LOGIN - Wird nach erfolgreicher Anmeldung ausgelöst

  • EVENT_BEFORE_LOGOUT- Wird am Anfang von yii \ web \ User :: logout () ausgelöst.

  • EVENT_AFTER_LOGOUT - Wird nach erfolgreicher Abmeldung ausgelöst