首頁 後端開發 php教程 Yii2框架自動登入以及登入登出功能的實作方法

Yii2框架自動登入以及登入登出功能的實作方法

Oct 25, 2017 am 09:02 AM
yii2 登入

自動登入的原理很簡單。主要就是利用cookie來實現的

在第一次登入的時候,如果登入成功並且選中了下次自動登錄,那麼就會把使用者的認證資訊保存到cookie中,cookie的有效期為1年或者幾個月。

在下次登入的時候先判斷cookie中是否儲存了使用者的信息,如果有則用cookie中儲存的使用者資訊來登錄,

配置User元件

首先在設定檔的components中設定user元件


#
'user' => [
 'identityClass' => 'app\models\User',
 'enableAutoLogin' => true,
],
登入後複製

我們看到enableAutoLogin就是用來判斷是否要啟用自動登入功能,這個和介面上的下次自動登入無關。

只有在enableAutoLogin為true的情況下,如果選擇了下次自動登錄,那麼就會把使用者資訊儲存起來放到cookie中並設定cookie的有效期為3600*24 *30秒,以用於下次登入

現在我們來看看Yii中是如何實現的。

一、第一次登入記憶體cookie

#1、login 登入功能


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));
  }
}
登入後複製

這個方法比較重要,在退出的時候也需要呼叫這個方法。

這個方法主要有三個功能

① 設定session的有效期

② 如果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中的使用者資訊包含有三個值:

#$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);反序列化為陣列。

這個從上面的程式碼可以知道要實現自動登錄,這三個值都必須有值。另外,在User Model中還必須實作findIdentityvalidateAuthKey這兩個方法。

登入完成後,還可以再重新設定cookie的有效期,這樣便能一起有效下去了。


$this->switchIdentity($identity, $this->autoRenewCookie ? $duration : 0);
登入後複製

三、退出logout


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框架自動登入以及登入登出功能的實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

小紅書怎麼登入以前的帳號?它換綁後原來號碼遺失了怎麼辦? 小紅書怎麼登入以前的帳號?它換綁後原來號碼遺失了怎麼辦? Mar 21, 2024 pm 09:41 PM

隨著社群媒體的快速發展,小紅書成為許多年輕人分享生活、探索新產品的熱門平台。在使用過程中,有時使用者可能會遇到登入先前帳號的困難。本文將詳細探討如何解決小紅書登入舊帳號的問題,以及如何應對更換綁定後可能遺失原帳號的情況。一、小紅書怎麼登入以前的帳號? 1.找回密碼登入如果長時間未登入小紅書,可能導致帳號被系統回收。為了恢復存取權限,你可以嘗試透過找回密碼的方式重新登入帳號。操作步驟如下:(1)開啟小紅書App或官網,點選「登入」按鈕。 (2)選擇「找回密碼」。 (3)輸入你註冊帳號時所使用的手機號碼

wallpaperengine登入別的號碼後下載別人的桌布怎麼辦 wallpaperengine登入別的號碼後下載別人的桌布怎麼辦 Mar 19, 2024 pm 02:00 PM

當你在自己電腦上登過別人steam帳號之後,剛好這個別人的帳號也有wallpaper軟體,切換回自己帳號之後steam就會自動下載別人帳號訂閱的桌布,使用者可以透過關閉steam雲端同步解決。 wallpaperengine登入別的號碼後下載別人的桌布怎麼辦1、登陸你自己的steam帳號,在設定裡面找到雲端同步,關閉steam雲端同步。 2.登陸你之前登陸的別人的steam帳號,打開wallpaper創意工坊,找到訂閱內容,然後取消全部訂閱。 (以後防止找不到壁紙,可以先收藏再取消訂閱)3、切換回自己的stea

《陰陽師》茨木童子典藏皮膚登入即領,禪心雲外鏡新造型即將上線! 《陰陽師》茨木童子典藏皮膚登入即領,禪心雲外鏡新造型即將上線! Jan 05, 2024 am 10:42 AM

山野間萬鬼嘶鳴,隱沒兵刃交接之聲,越嶺奔赴而來的鬼將,心中戰意洶湧,以炎火為號,率百鬼衝鋒迎戰。 【熾焱百煉•茨木童子典藏皮膚上線】鬼角熾焰怒燃,鎏金眼眸迸發桀駿戰意,白玉甲片裝飾戰袍,彰顯大妖不羈狂放的氣勢。雪白飄揚的袖擺上,赤焰攀附交織,金紋烙印其中,燃點一片緋艷妖異色彩。妖力凝聚而成的鬼火咆哮而至,烈焰令群巒為之震動,煉獄間歸來的妖鬼啊,一同懲戒進犯之人吧。 【專屬動態頭像框•熾焱百煉】【專屬插畫•焰火將魂】【傳記鑑賞】【獲取方式】茨木童子典藏皮膚·熾焱百煉將於12月28日維護後上架皮膚商店,

Discuz後台登入問題解決方法大揭秘 Discuz後台登入問題解決方法大揭秘 Mar 03, 2024 am 08:57 AM

Discuz後台登入問題解決方法大揭秘,需要具體程式碼範例隨著網路的快速發展,網站建置變得越來越普遍,而Discuz作為一款常用的論壇建站系統,受到了許多站長的青睞。然而,正是因為其功能強大,有時候我們在使用Discuz的過程中會遇到一些問題,例如後台登入問題。今天,我們就來大揭秘Discuz後台登入問題的解決方法,並且提供具體的程式碼範例,希望能幫助到有需要

快手電腦版怎麼登入-快手電腦版的登入方法 快手電腦版怎麼登入-快手電腦版的登入方法 Mar 04, 2024 pm 03:30 PM

近日有一些小夥伴諮詢小編快手電腦版怎麼登入?下面就為大家帶來了快手電腦版的登入方法,有需要的小夥伴可以來了解了解哦。第一步:先在電腦的瀏覽器上百度搜尋快手官網。第二步:在搜尋結果清單裡面選取第一條。第三步:進入快手官網主頁面後,點選影片的選項。第四步:點選右上角的使用者頭像。步驟五:在彈出的登入選單裡面點選二維碼登入。步驟六:之後打開手機上的快手,點選左上角的圖示。第七步:點選二維碼標誌。第八步:在我的二維碼介面點擊右上角的掃描圖示之後,掃描電腦上的二維碼即可。第九步:最後電腦版的快手就登入成

如何在 Windows 11/10 上安裝 GitHub Copilot 如何在 Windows 11/10 上安裝 GitHub Copilot Oct 21, 2023 pm 11:13 PM

GitHubCopilot是編碼人員的下一個級別,它基於AI的模型可以成功預測和自動完成您的程式碼。但是,您可能想知道如何在您的裝置上加入這個AI天才,以便您的編碼變得更加容易!但是,使用GitHub並不是很容易,初始設定過程是一個棘手的過程。因此,我們創建了這個逐步教程,介紹如何在Windows11、10上的VSCode中安裝和實作GitHubCopilot。如何在Windows上安裝GitHubCopilot此過程有幾個步驟。因此,請立即執行以下步驟。步驟1–您必須在電腦上安裝最新版本的可視

為什麼電腦版微信登入不了 為什麼電腦版微信登入不了 Aug 18, 2023 pm 02:07 PM

電腦版微信登入不了是由於網路連線問題、帳號密碼輸入錯誤、微信伺服器故障、作業系統或應用程式問題、帳號被封鎖或異常登入等原因所導致。詳細介紹:1、網路連線問題,嘗試重新連接網路或更換網路環境;2、帳號密碼輸入錯誤,嘗試使用手機版微信登入確認帳號與密碼是否正確;3、微信伺服器故障,嘗試等待一段時間後再次嘗試登入;4、作業系統或應用程式問題,嘗試更新作業系統或微信應用程式等。

百度網盤網頁版怎麼進?百度網盤網頁版登入入口 百度網盤網頁版怎麼進?百度網盤網頁版登入入口 Mar 13, 2024 pm 04:58 PM

  百度網盤不僅能儲存各種軟體資源,還能分享給別人,支援多端同步,如果你的電腦沒有下載客戶端,可以選擇進入網頁版使用。那麼百度網盤網頁版要怎麼登入呢?下面就來看看詳細介紹。  百度網盤網頁版登入入口:https://pan.baidu.com(複製連結至瀏覽器開啟)  軟體介紹  1、分享  提供文件分享功能,使用者將文件整理,分享給需要的小夥伴。  2、雲端  不佔用太多內存,大多數檔案都保存在雲端,有效節省電腦空間。  3、相簿  支援雲相簿功能,將照片匯入到雲盤中,然後整理,方便大家查看。  

See all articles