ホームページ バックエンド開発 PHPチュートリアル Yii2 フレームワークは、ログイン、ログアウト、自動ログイン機能を実装します。

Yii2 フレームワークは、ログイン、ログアウト、自動ログイン機能を実装します。

Jan 10, 2018 pm 04:10 PM
yii2 ログイン やめる

この記事では、ログイン、ログアウト、自動ログイン機能を実現するための Yii2 フレームワークの原理、実装方法、および関連する操作上の注意点をサンプルの形式で詳細に分析します。 . 次に、困っている友達が参考になれば幸いです。

この記事の例では、Yii2 フレームワークがログイン、ログアウト、および自動ログイン機能を実装する方法を説明します。参考のために皆さんと共有してください。詳細は次のとおりです:

自動ログインの原理は非常に簡単です。これは主に Cookie を使用して実現されます。初回ログイン時にログインに成功し、次回から自動ログインを選択すると、ユーザーの認証情報が Cookie に保存されます。Cookie の有効期間は 1 年間です。もっと月。

次回ログインするときに、まずユーザーの情報が Cookie に保存されているかどうかを確認し、保存されている場合は、Cookie に保存されているユーザー情報を使用してログインします。

User コンポーネントを設定します設定ファイルのコンポーネント内のユーザーコンポーネント

'user' => [
 'identityClass' => 'app\models\User',
 'enableAutoLogin' => true,
],
ログイン後にコピー

は、自動ログイン機能を有効にするかどうかを決定するために

enableAutoLogin

が使用されていることがわかります。これは、インターフェイスでの次回の自動ログインとは関係がありません。

enableAutoLogin

がtrueの場合のみ、次回から自動的にログインすることを選択すると、ユーザー情報はCookieに保存され、次回のCookieの有効期間は3600*24*30秒に設定されますログイン それでは、Yii でどのように実装されるかを見てみましょう。

1. 初回ログイン時に Cookie を保存する

1. ログイン関数

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 '$id' logged in from $ip with duration $duration.", __METHOD__);
   $this->afterLogin($identity, false, $duration);
  }
  return !$this->getIsGuest();
}
ログイン後にコピー

ここでは簡単なログインを行い、

switchIdentity

メソッドを実行して設定します認証情報。

2. switchIdentity は認証情報を設定します

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));
  }
}
ログイン後にコピー

このメソッドはより重要であり、終了時に呼び出す必要があります。

この方法には主に3つの機能があります

①セッションの有効期限を設定します

②Cookieの有効期限が0より大きく、自動ログインが許可されている場合、ユーザーの認証情報をCookieに保存します

③自動ログインを許可している場合は、Cookie情報を削除してください。これは終了時に呼び出されます。終了時に渡される

$identity は null です

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);
}
ログイン後にコピー

Cookie に保存されるユーザー情報には、次の 3 つの値が含まれます:

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

getId()和getAuthKey()是在IdentityInterface接口中的。我们也知道在设置User组件的时候,这个User Model是必须要实现IdentityInterface接口的。所以,可以在User Model中得到前两个值,第三值就是cookie的有效期。

二、自动从cookie登录

从上面我们知道用户的认证信息已经存储到cookie中了,那么下次的时候直接从cookie里面取信息然后设置就可以了。

1、AccessControl用户访问控制

Yii提供了AccessControl来判断用户是否登录,有了这个就不需要在每一个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;],
     ],
    ],
   ],
  ];
}
ログイン後にコピー

2、getIsGuest、getIdentity判断是否认证用户

isGuest是自动登录过程中最重要的属性。

在上面的AccessControl访问控制里面通过IsGuest属性来判断是否是认证用户,然后在getIsGuest方法里面是调用getIdentity来获取用户信息,如果不为空就说明是认证用户,否则就是游客(未登录)。


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;
}
ログイン後にコピー

3、renewAuthStatus 重新生成用户认证信息


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();
   }
  }
}
ログイン後にコピー

这一部分先通过session来判断用户,因为用户登录后就已经存在于session中了。然后再判断如果是自动登录,那么就通过cookie信息来登录。

4、通过保存的Cookie信息来登录 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__);
    }
   }
  }
}
ログイン後にコピー

先读取cookie值,然后$data = json_decode($value, true);

getId() と getAuthKey() は

IdentityInterface インターフェースにあります。また、User コンポーネントを設定する場合、User Model は IdentityInterface インターフェイスを実装する必要があることもわかっています。したがって、ユーザー モデルの最初の 2 つの値を取得でき、3 番目の値は Cookie の有効期間です。

2. Cookie から自動的にログインします


上記のことから、ユーザーの認証情報が Cookie に保存されていることがわかりますので、次回からは Cookie から直接情報を取得して設定するだけで済みます。

1. AccessControl ユーザーのアクセス制御Yii は、ユーザーがログインしているかどうかを判断する AccessControl を提供します。これにより、getIsGuest と getIdentity がログインしているかどうかを判断する必要がなくなります。認証されたユーザー


isGuest は、自動ログイン プロセスで最も重要な属性です。

🎜上記の AccessControl アクセス制御では、🎜IsGuest🎜 属性を使用して認証されたユーザーであるかどうかを判断し、🎜getIsGuest メソッド🎜で 🎜getIdentity🎜 を呼び出してユーザー情報を取得します。それが空でない場合は、それを意味します。これは認証されたユーザーであり、それ以外の場合はゲスト (ログインしていません) です。 🎜🎜🎜🎜
$this->switchIdentity($identity, $this->autoRenewCookie ? $duration : 0);
ログイン後にコピー
🎜🎜3. renewAuthStatusはユーザー認証情報を再生成します🎜🎜🎜🎜🎜
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));
  }
}
ログイン後にコピー
ログイン後にコピー
🎜 この部分では、ユーザーはログイン後にセッションにすでに存在しているため、最初にセッションを通じてユーザーを判断します。次に、自動ログインかどうかを判断し、Cookie 情報を使用してログインします。 🎜🎜🎜4. 保存された Cookie 情報を使用してログインします🎜🎜🎜🎜🎜rrreee🎜最初に Cookie 値を読み取り、次にそれを $data = json_decode($value, true); に逆シリアル化します。配列 。 🎜🎜上記のコードから、自動ログインを実現するには、これら 3 つの値に値が必要であることがわかります。さらに、2 つのメソッド 🎜findIdentity🎜 と 🎜validateAuthKey🎜 もユーザー モデルに実装する必要があります。 🎜🎜ログイン後、Cookieの有効期間をリセットして、Cookieを常に有効にすることができます。 🎜🎜🎜🎜rree🎜🎜🎜3. ログアウトを終了します🎜🎜🎜🎜🎜🎜
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));
  }
}
ログイン後にコピー
ログイン後にコピー

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

相关推荐:

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

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

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

以上がYii2 フレームワークは、ログイン、ログアウト、自動ログイン機能を実装します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

壁紙エンジンで別のアカウントにログインした後、他の人の壁紙をダウンロードした場合はどうすればよいですか? 壁紙エンジンで別のアカウントにログインした後、他の人の壁紙をダウンロードした場合はどうすればよいですか? Mar 19, 2024 pm 02:00 PM

自分のコンピュータで他人の Steam アカウントにログインし、その他人のアカウントに壁紙ソフトウェアがインストールされている場合、自分のアカウントに切り替えた後、Steam は他人のアカウントに登録されている壁紙を自動的にダウンロードします。 Steam クラウドの同期をオフにします。別のアカウントにログインした後に、wallpaperengine が他の人の壁紙をダウンロードした場合の対処方法 1. 自分の steam アカウントにログインし、設定でクラウド同期を見つけて、steam クラウド同期をオフにします。 2. 以前にログインしたことのある他の人の Steam アカウントにログインし、壁紙クリエイティブ ワークショップを開き、サブスクリプション コンテンツを見つけて、すべてのサブスクリプションをキャンセルします。 (将来壁紙が見つからない場合は、まず壁紙を収集してからサブスクリプションをキャンセルできます) 3. 自分の Steam に戻ります。

小紅書で以前のアカウントにログインするにはどうすればよいですか?再接続後に元の番号が失われた場合はどうすればよいですか? 小紅書で以前のアカウントにログインするにはどうすればよいですか?再接続後に元の番号が失われた場合はどうすればよいですか? Mar 21, 2024 pm 09:41 PM

ソーシャル メディアの急速な発展に伴い、Xiaohongshu は多くの若者が生活を共有し、新製品を探索するための人気のプラットフォームになりました。使用中に、ユーザーが以前のアカウントにログインできない場合があります。この記事では、Xiaohongshuで古いアカウントにログインできない問題の解決方法と、バインドを変更した後に元のアカウントが失われる可能性への対処方法について詳しく説明します。 1. 小紅書の前のアカウントにログインするにはどうすればよいですか? 1. パスワードを取得してログインします。Xiaohongshu に長期間ログインしない場合、アカウントがシステムによってリサイクルされる可能性があります。アクセス権を復元するには、パスワードを取得してアカウントへのログインを再試行します。操作手順は以下の通りです。 (1) 小紅書アプリまたは公式サイトを開き、「ログイン」ボタンをクリックします。 (2) 「パスワードを取得」を選択します。 (3) アカウント登録時に使用した携帯電話番号を入力してください

『陰陽師』茨木童子のコレクションスキンはログインするとすぐに入手できるほか、新スキン「禅心雲鏡」も近日登場予定! 『陰陽師』茨木童子のコレクションスキンはログインするとすぐに入手できるほか、新スキン「禅心雲鏡」も近日登場予定! Jan 05, 2024 am 10:42 AM

山野に数千の亡霊の叫び声が響き、武器を取り交わす音が消え、闘志を胸に山を越えて駆けつけた亡霊将軍たちは火をラッパに吹き、数百の亡霊を率いて突撃した。戦いへ。 【烈火の梅蓮・茨木童子コレクションスキンがオンライン販売開始】 炎が燃え盛る幽霊の角、荒々しい闘志がほとばしる金色の瞳、そしてシャツを彩る白翡翠の甲冑は、偉大なる者の手に負えない野性的な勢いを表しています。悪魔。雪のように白くはためく袖には、赤い炎が絡みつき、金の模様が刻まれ、紅く幻想的な色を灯した。凝縮された悪魔の力によって形成された意志のウィスプが咆哮し、激しい炎が山を揺るがしました煉獄から戻った悪魔と幽霊、一緒に侵入者を懲らしめましょう。 【専用ダイナミックアバターフレーム・烈火の炎のバイリアン】 【専用イラスト・花火将軍魂】 【伝記鑑賞】 【入手方法】 茨木童子のコレクションスキン・烈火の炎のバイリアンは、12月28日メンテナンス後よりスキンストアに登場いたします。

バックグラウンドログインの問題の解決策を明らかにする バックグラウンドログインの問題の解決策を明らかにする Mar 03, 2024 am 08:57 AM

Discuz のバックグラウンド ログイン問題の解決策が明らかになりました。特定のコード サンプルが必要です。インターネットの急速な発展に伴い、Web サイトの構築がますます一般的になってきました。Discuz は、一般的に使用されるフォーラム Web サイト構築システムとして、次のユーザーに好まれています。多くのウェブマスター。しかし、その強力な機能ゆえに、Discuz を使用する際にバックグラウンドでのログインの問題などの問題が発生することがあります。本日は、Discuz のバックグラウンド ログインの問題の解決策を明らかにし、具体的なコード例を提供します。

Kuaishou PC 版へのログイン方法 - Kuaishou PC 版へのログイン方法 Kuaishou PC 版へのログイン方法 - Kuaishou PC 版へのログイン方法 Mar 04, 2024 pm 03:30 PM

最近、何人かの友人が Kuaishou コンピュータ版へのログイン方法を尋ねてきました。ここでは Kuaishou コンピュータ版へのログイン方法を説明します。必要な友人が来て、さらに詳しく学ぶことができます。ステップ 1: まず、コンピュータのブラウザで Baidu の Kuaishou 公式 Web サイトを検索します。ステップ 2: 検索結果リストの最初の項目を選択します。ステップ 3: Kuaishou 公式ウェブサイトのメインページに入った後、ビデオオプションをクリックします。ステップ 4: 右上隅にあるユーザーのアバターをクリックします。ステップ 5: QR コードをクリックして、ポップアップ ログイン メニューでログインします。ステップ 6: 次に、携​​帯電話で Kuaishou を開き、左上隅のアイコンをクリックします。ステップ 7: QR コードのロゴをクリックします。ステップ 8: My QR コード インターフェイスの右上隅にあるスキャン アイコンをクリックした後、コンピューター上の QR コードをスキャンします。ステップ 9: 最後に、Kuaishou のコンピュータ版にログインします。

壁紙エンジンが終了すると壁紙が消えてしまうのはなぜですか? 壁紙エンジンが終了すると壁紙が消えてしまうのはなぜですか? Mar 12, 2024 pm 05:40 PM

ユーザーは、壁紙エンジンを使用してさまざまな壁紙を取得できます。多くのユーザーは、壁紙エンジンが終了すると壁紙が消えてしまう理由を知りません。動的壁紙は、壁紙をインストールしたソフトウェアがオンになっている場合にのみ、デスクトップ上で実行できます。壁紙エンジンが終了すると壁紙が消えてしまうのはなぜですか? 1. 動的壁紙は、壁紙をインストールしたソフトウェアがオンになっている場合にのみデスクトップで実行できます。 2.WallpaperEngine は元の壁紙を上書きします。もちろん、終了すると壁紙は消えます。 3. ファイル形式が画像タイプでない限り、壁紙はオフになった後も残ります。画像タイプは何らかの方法で取得できますが、動的ではありません。 4. Windows にはビデオや動画像が壁として存在しません。

Microsoft アカウントの終了チュートリアル: Win11 アカウントを終了する方法 Microsoft アカウントの終了チュートリアル: Win11 アカウントを終了する方法 Dec 25, 2023 pm 08:04 PM

以前の win11 アップデートでは、Microsoft アカウントでのログインを省略できましたが、最新の win11 ホームバージョンでは、インストール時に Microsoft アカウントでのログインが強制されます。ただし、Microsoft アカウントでログインすると、多くのトラブルが発生します。インストール完了後、ログアウトしたいのですが、終了方法を教えます。 win11 で Microsoft アカウントからログアウトする方法 1. まず、図に示すように、下のスタート メニューをクリックし、その中に「設定」を見つけます。 2. 設定インターフェースで「ユーザー」または「アカウント」オプションを見つけます。 3. ユーザー インターフェイスで、青いテキストの行である「代わりにローカル アカウントでログインします」を見つけます。 4. 次に、ローカル アカウントのパスワードを入力してローカル アカウントにログインし、Microsoft アカウントからログアウトします。

Quarkで2つのデバイスにログインする方法 Quarkで2つのデバイスにログインする方法 Feb 23, 2024 pm 10:55 PM

Quark を使用して 2 つのデバイスにログインするにはどうすればよいですか? Quark Browser は 2 つのデバイスへの同時ログインをサポートしていますが、ほとんどの友人は Quark Browser を使用して 2 つのデバイスにログインする方法を知りません。次に、エディターがユーザー Quark にログインさせます。メソッド グラフィック チュートリアル、興味のあるユーザーはぜひ見に来てください。 Quark Browserの使い方チュートリアル Quark 2台のデバイスにログインする方法 1. まずQuark Browser APPを開き、メインページで[Quark Network Disk]をクリックします; 2. 次に、Quark Network Diskインターフェイスに入り、[My Backup]サービス機能を選択します; 3. 最後に、[デバイスの切り替え]を選択して、2 台の新しいデバイスにログインします。

See all articles