[TOC]
# 簡介
前面提到判斷用戶登錄用`Yii::$app->user->isGuest`來確定是否登錄
但是通常大多數功能都要登錄后才使用,那如果每一個站內功能都寫這個if判斷肯定是不現實
其實大家也能想到一些技巧來實現,比如定義一個控制器基類,在基類的init方法里做isGuest判斷,所有控制器繼承它就行了
# 方法1:官方推薦,用訪問過濾器來判斷
其實這并不是我最推薦的方式,但為了順利把官方的基礎知識學一下,我覺得有必要掌握一下這招
官方在過濾器封裝好了一套登錄校驗邏輯,我們可以直接拿來配置一下就能用上,并且對于需求不斷變化的應用來說,用這個比較好擴展
還記得[過濾器](http://www.kkh86.com/it/yii2/guide-base-filter.html)這篇文章里提到的過濾器吧,在做登錄授權的時候就是使用官方自帶的[yii\\filters\\AccessControl](http://www.yiichina.com/doc/api/2.0/yii-filters-accesscontrol)這個“訪問控制”過濾器
好了我們假設有個控制器要用,那就在這個控制器里重寫父類的behaviors方法:
~~~php
public function behaviors(){
return [
'access' => [
'class' => 'yii\filters\AccessControl',
'rules' => [ //檢測規則
[ //第1條規則
'roles' => ['@'], //角色集合,@表示登錄用戶
'allow' => true, //是否允許訪問
],
[ //第2條規則
'actions' => ['login', 'register'], //針對本控制器的哪些方法ID生效,這兩個ID就是針對actionLogin和actionRegister兩個方法生效
'roles' => ['?'], //? 表示未登錄用戶
'allow' => true, //允許未登錄用戶訪問
],
],
],
];
}
~~~
配置好后未登錄狀態下可以運行控制器的login和register方法,不能運行其它方法,會返回HTTP 403,這是訪問控制過濾器的基本使用,晚點再慢慢深入掌握它
* #### 訪問過濾器規則的封裝
雖然重寫behaviors方法使用過濾器就能實現登錄檢測,但這代碼行數也不比自己寫邏輯的少,而且還要每個控制器去配置這還得了?
那當然還是封裝一個基礎控制器,其它控制器繼承它來實現繼承過濾器規則咯
但這樣增加了繼承體系總感覺有點不好是吧,還可以這樣,定義一個Trait,里面就是behaviors方法:
~~~php
namespace app\lib;
trait TraitCheckLogin{
public function behaviors(){
return [
'access' => [
'class' => 'yii\filters\AccessControl',
'rules' => [ //檢測規則
[ //第1條規則
'roles' => ['@'], //角色集合,@表示登錄用戶
'allow' => true, //是否允許訪問
],
[ //第2條規則
'actions' => ['login', 'register'], //針對本控制器的哪些方法ID生效,這兩個ID就是針對actionLogin和actionRegister兩個方法生效
'roles' => ['?'], //? 表示未登錄用戶
'allow' => true, //允許未登錄用戶訪問
],
],
],
];
}
}
~~~
然后在各個控制器里加上`use TraitCheckLogin;`就可以了(因為大部分程序員少接觸trait這個知識點所以這樣講了)
* * *
* #### 配置登錄地址
像上面這樣使用了AccessControl過濾器后,在未登錄的情況下訪問時不會自動跳到登錄頁面,這樣的用戶體驗不好
這里我們其實只要給user組件配置一下`loginUrl`就能讓它自動跳過去了:
~~~php
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
'loginUrl' => '/login.html', //!!!重點!!!
//'loginUrl' => ['site/show-login'], //可以用數組,底層會拿去Url::to處理
//'loginUrl' => 'http://xxx.com/oauth.html', //甚至是絕對地址
],
~~~
# 方法2:在app初始化的時候就做登錄檢測,適合中小型的典型應用
追加到配置文件第一層key(相關知識點:[在配置里定義事件](http://www.kkh86.com/it/yii2-adv/guide-base-listen-event-with-config.html)):
~~~php
'on beforeAction' => function($event){
if(!Yii::$app->user->isGuest){
//已經登錄就隨便他訪問吧
return;
}
$isCommonAccessAction = in_array($event->action->controller->module->requestedRoute, [
'user/register',
'user/login',
'site/error',
'site/captcha',
]); //是否不登陸可以訪問
if(!$isCommonAccessAction){
$event->isValid = false;
Yii::$app->response->redirect(Yii::$app->user->loginUrl);
}
}
~~~
- 目錄
- 配置
- 簡介
- 別名
- gii
- 配置項
- 模型
- 簡介
- 增刪改查
- AR和model
- 模型事件
- 場景
- query查詢
- 增刪改
- AR查詢器
- 模型關系定義
- AR模型連表查詢
- fields
- where拼接
- 模塊
- 創建模塊
- 控制器
- 表單
- 跳轉
- 響應
- 驗證器
- Action
- 組件
- url
- 分頁
- 驗證碼
- 緩存
- 文件上傳
- 預啟動組件
- 事件
- 自定義組件
- redis
- 日志
- 行為
- cookie和session
- 基礎知識
- 創建一個類
- 配置一個類
- object基類
- component組件類特性
- phpstorm無法更改php等級
- url地址美化
- 過濾器
- 請求處理
- 請求組件
- 響應組件
- header
- 用戶登錄
- 實現IdentityInterface接口
- 登錄
- 自動檢測登錄
- 獲取用戶信息
- 訪問行為追蹤
- phpstorm+postman斷點調試