Le framework Yii2 implémente les fonctions de connexion, de déconnexion et de connexion automatique

小云云
Libérer: 2023-03-19 12:28:01
original
2442 Les gens l'ont consulté

Cet article présente principalement la méthode du framework Yii2 pour implémenter les fonctions de connexion, de déconnexion et de connexion automatique. Il analyse en détail le principe, la méthode de mise en œuvre et les précautions de fonctionnement associées du framework Yii2 pour réaliser les fonctions de connexion, de déconnexion et de connexion automatique sous la forme. d'exemples. Amis dans le besoin Vous pouvez vous y référer, j'espère que cela pourra aider tout le monde.

L'exemple de cet article décrit comment le framework Yii2 implémente les fonctions de connexion, de déconnexion et de connexion automatique. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Le principe de la connexion automatique est très simple. Ceci est principalement réalisé en utilisant des cookies

Lors de la première connexion, si la connexion réussit et que la connexion automatique la prochaine fois est sélectionnée, les informations d'authentification de l'utilisateur seront enregistrées dans le cookie, ainsi que la période de validité du cookie. est de 1 ans ou mois.

La prochaine fois que vous vous connecterez, déterminez d'abord si les informations de l'utilisateur sont stockées dans le cookie. Si tel est le cas, utilisez les informations de l'utilisateur stockées dans le cookie pour vous connecter.

Configurer le composant utilisateur

Définissez d'abord le composant utilisateur dans les composants du fichier de configuration


'user' => [
 'identityClass' => 'app\models\User',
 'enableAutoLogin' => true,
],
Copier après la connexion

On voit enableAutoLogin Il est utilisé pour déterminer s'il faut activer la fonction de connexion automatique. Cela n'a rien à voir avec la prochaine connexion automatique sur l'interface.

Uniquement lorsque enableAutoLogin est vrai, si vous choisissez de vous connecter automatiquement la prochaine fois, les informations utilisateur seront stockées dans un cookie et la période de validité du cookie sera fixée à 3600* 24 * 30 secondes pour la prochaine connexion

Voyons maintenant comment cela est implémenté dans Yii.

1. Enregistrez les cookies lors de la première connexion

Fonction de connexion

<🎜. >


public function login($identity, $duration = 0)
{
  if ($this->beforeLogin($identity, false, $duration)) {
   $this->switchIdentity($identity, $duration);
   $id = $identity->getId();
   $ip = Yii::$app->getRequest()->getUserIP();
   Yii::info("User &#39;$id&#39; logged in from $ip with duration $duration.", __METHOD__);
   $this->afterLogin($identity, false, $duration);
  }
  return !$this->getIsGuest();
}
Copier après la connexion
Ici, connectez-vous simplement, puis exécutez la méthode

switchIdentity pour définir les informations d'authentification.

2. switchIdentity définit les informations d'authentification


public function switchIdentity($identity, $duration = 0)
{
  $session = Yii::$app->getSession();
  if (!YII_ENV_TEST) {
   $session->regenerateID(true);
  }
  $this->setIdentity($identity);
  $session->remove($this->idParam);
  $session->remove($this->authTimeoutParam);
  if ($identity instanceof IdentityInterface) {
   $session->set($this->idParam, $identity->getId());
   if ($this->authTimeout !== null) {
    $session->set($this->authTimeoutParam, time() + $this->authTimeout);
   }
   if ($duration > 0 && $this->enableAutoLogin) {
    $this->sendIdentityCookie($identity, $duration);
   }
  } elseif ($this->enableAutoLogin) {
   Yii::$app->getResponse()->getCookies()->remove(new Cookie($this->identityCookie));
  }
}
Copier après la connexion
Cette méthode est plus importante et doit être appelée lors de la sortie de .

Cette méthode a principalement trois fonctions

① Définir la durée de validité de la session

② Si ​​la durée de validité du cookie est supérieure à 0 et que la connexion automatique est autorisée, puis enregistrez les informations d'authentification de l'utilisateur dans

③ dans le cookie. Si la connexion automatique est autorisée, supprimez les informations du cookie. Ceci est appelé lors de la sortie. La

$identity transmise à la sortie est nulle


protected function sendIdentityCookie($identity, $duration)
{
  $cookie = new Cookie($this->identityCookie);
  $cookie->value = json_encode([
   $identity->getId(),
   $identity->getAuthKey(),
   $duration,
  ]);
  $cookie->expire = time() + $duration;
  Yii::$app->getResponse()->getCookies()->add($cookie);
}
Copier après la connexion
Les informations utilisateur stockées dans le cookie contiennent trois valeurs :

$identity->getId()<p>$identity->getAuthKey()<code>$identity->getId()<br/>$identity->getAuthKey()<br/>$duration$duration

getId() et getAuthKey() sont dans IdentityInterface dans l'interface. Nous savons également que lors de la configuration du composant User, le modèle utilisateur doit implémenter l'interface IdentityInterface. Par conséquent, vous pouvez obtenir les deux premières valeurs​​dans le modèle utilisateur, et la troisième valeur est la durée de validité du cookie.

2. Connectez-vous automatiquement à partir des cookies

D'après ce qui précède, nous savons que les informations d'authentification de l'utilisateur ont été stockées dans le cookie, donc ensuite time Récupérez simplement les informations directement à partir du cookie et définissez-les.

1. Contrôle d'accès utilisateur AccessControl

Yii fournit AccessControl pour déterminer si l'utilisateur est connecté. Avec cela, il n'est pas nécessaire de juger à nouveau à chaque action


public function behaviors()
{
  return [
   &#39;access&#39; => [
    &#39;class&#39; => AccessControl::className(),
    &#39;only&#39; => [&#39;logout&#39;],
    &#39;rules&#39; => [
     [
      &#39;actions&#39; => [&#39;logout&#39;],
      &#39;allow&#39; => true,
      &#39;roles&#39; => [&#39;@&#39;],
     ],
    ],
   ],
  ];
}
Copier après la connexion

2. getIsGuest et getIdentity déterminent s'il faut authentifier l'utilisateur

isGuest est l'attribut le plus important dans la connexion automatique. processus.

Dans le contrôle d'accès AccessControl ci-dessus, utilisez l'attribut IsGuest pour déterminer s'il s'agit d'un utilisateur authentifié, puis appelez getIdentity dans la méthode getIsGuest Récupérez les informations de l'utilisateur. Si elle n'est pas vide, cela signifie que c'est un utilisateur authentifié, sinon c'est un visiteur (non connecté).


public function getIsGuest($checkSession = true)
{
  return $this->getIdentity($checkSession) === null;
}
public function getIdentity($checkSession = true)
{
  if ($this->_identity === false) {
   if ($checkSession) {
    $this->renewAuthStatus();
   } else {
    return null;
   }
  }
  return $this->_identity;
}
Copier après la connexion

3. renouvelerAuthStatus régénère les informations d'authentification de l'utilisateur


protected function renewAuthStatus()
{
  $session = Yii::$app->getSession();
  $id = $session->getHasSessionId() || $session->getIsActive() ? $session->get($this->idParam) : null;
  if ($id === null) {
   $identity = null;
  } else {
   /** @var IdentityInterface $class */
   $class = $this->identityClass;
   $identity = $class::findIdentity($id);
  }
  $this->setIdentity($identity);
  if ($this->authTimeout !== null && $identity !== null) {
   $expire = $session->get($this->authTimeoutParam);
   if ($expire !== null && $expire < time()) {
    $this->logout(false);
   } else {
    $session->set($this->authTimeoutParam, time() + $this->authTimeout);
   }
  }
  if ($this->enableAutoLogin) {
   if ($this->getIsGuest()) {
    $this->loginByCookie();
   } elseif ($this->autoRenewCookie) {
    $this->renewIdentityCookie();
   }
  }
}
Copier après la connexion

Ceci partie détermine d'abord l'utilisateur via la session, car l'utilisateur existe déjà dans la session après la connexion. Déterminez ensuite s'il s'agit d'une connexion automatique, puis connectez-vous via les informations du cookie.

4. Connectez-vous via les informations de cookie enregistrées loginByCookie


protected function loginByCookie()
{
  $name = $this->identityCookie[&#39;name&#39;];
  $value = Yii::$app->getRequest()->getCookies()->getValue($name);
  if ($value !== null) {
   $data = json_decode($value, true);
   if (count($data) === 3 && isset($data[0], $data[1], $data[2])) {
    list ($id, $authKey, $duration) = $data;
    /** @var IdentityInterface $class */
    $class = $this->identityClass;
    $identity = $class::findIdentity($id);
    if ($identity !== null && $identity->validateAuthKey($authKey)) {
     if ($this->beforeLogin($identity, true, $duration)) {
      $this->switchIdentity($identity, $this->autoRenewCookie ? $duration : 0);
      $ip = Yii::$app->getRequest()->getUserIP();
      Yii::info("User &#39;$id&#39; logged in from $ip via cookie.", __METHOD__);
      $this->afterLogin($identity, true, $duration);
     }
    } elseif ($identity !== null) {
     Yii::warning("Invalid auth key attempted for user &#39;$id&#39;: $authKey", __METHOD__);
    }
   }
  }
}
Copier après la connexion

Lisez d'abord la valeur du cookie, puis $data = json_decode($value, true); Désérialisez en tableau.

À partir du code ci-dessus, nous pouvons savoir que pour obtenir une connexion automatique, ces trois valeurs​​doivent avoir des valeurs. De plus, les deux méthodes findIdentity et validateAuthKey doivent également être implémentées dans le modèle utilisateur.

Après vous être connecté, vous pouvez réinitialiser la durée de validité du cookie afin qu'il soit valable tout le temps.


$this->switchIdentity($identity, $this->autoRenewCookie ? $duration : 0);
Copier après la connexion

3. Quitter la déconnexion


public function logout($destroySession = true)
{
  $identity = $this->getIdentity();
  if ($identity !== null && $this->beforeLogout($identity)) {
   $this->switchIdentity(null);
   $id = $identity->getId();
   $ip = Yii::$app->getRequest()->getUserIP();
   Yii::info("User '$id' logged out from $ip.", __METHOD__);
   if ($destroySession) {
    Yii::$app->getSession()->destroy();
   }
   $this->afterLogout($identity);
  }
  return $this->getIsGuest();
}
public function switchIdentity($identity, $duration = 0)
{
  $session = Yii::$app->getSession();
  if (!YII_ENV_TEST) {
   $session->regenerateID(true);
  }
  $this->setIdentity($identity);
  $session->remove($this->idParam);
  $session->remove($this->authTimeoutParam);
  if ($identity instanceof IdentityInterface) {
   $session->set($this->idParam, $identity->getId());
   if ($this->authTimeout !== null) {
    $session->set($this->authTimeoutParam, time() + $this->authTimeout);
   }
   if ($duration > 0 && $this->enableAutoLogin) {
    $this->sendIdentityCookie($identity, $duration);
   }
  } elseif ($this->enableAutoLogin) {
   Yii::$app->getResponse()->getCookies()->remove(new Cookie($this->identityCookie));
  }
}
Copier après la connexion

退出的时候先把当前的认证设置为null,然后再判断如果是自动登录功能则再删除相关的cookie信息。

相关推荐:

Yii2框架实现可逆加密的简单方法分享

使用YII2框架开发实现微信公众号中表单提交功能教程详解

Yii2框架中日志的使用方法分析

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal