概述
授權是指驗證用戶是否允許做某件事的過程。Yii提供兩種授權方法: 存取控制過濾器(ACF)和基於角色的存取控制(RBAC)。在做用戶平臺前臺應用時, AFC是比較常用, 易用的控制用戶哪些頁面可以直接訪問, 哪些頁面需要登錄後訪問的授權機制.
ACF, Access Control Filter, 是一個Yii中的過濾器. yii\filters\AccessControl類來實現.
使用
由於是過濾器, 因此需要在控制器類的方法behaviors()方法中定義. 以示例的SiteController爲例:
以上配置中, 就配置瞭如下內容
- only選項表示該過濾器針對於logout, signup起作用
- rules選項定義了動作的訪問規則, 其中
- actions表示當前規則針對於哪些動作起作用,
- roles表示請求該動作的身份角色, 使用?問號表示未登錄用戶, @表示已登錄用戶
- allow表示是否允許, true允許, false不允許.
總結來說, 就是在當前控制器中, 未登錄用戶可以訪問signup動作進行註冊, 而登錄用戶纔可以訪問logout動作, 執行退出工作.
對於我們來說, 主要是配置only中針對的動作, 以及將動作分配到允許和禁止的規則中. only選項表示該過濾器針對於哪些動作起作用, 如果沒有在only列表中的動作, 表示默認授權, 可以訪問的動作. 因此想要控制, 一定要加入到only列表中.
將上面的代碼複製到任何的控制器中, 都可以立即起作用的, 很容易的呢!
此時, 經過AccessControl過濾器的判斷, 如果當前沒有授權執行某些操作, 則會重定向到登錄頁面. 如果沒有授權的用戶是已登錄(認證)用戶, 則會拋出Forbidden異常. 同時允許自定義沒有授權的處理行爲, 通過爲denyCallback提供回調函數可以完成.
AccessControl選項列表
完整的AccessControl屬性列表, 請參見.
- yii\filters\AccessRule::allow: 指定該規則是 “允許” 還是 “拒絕” 。(譯者注:true是允許,false是拒絕)
- yii\filters\AccessRule::actions:指定該規則用於匹配哪些操作。 它的值應該是操作方法的ID數組。匹配比較是大小寫敏感的。如果該選項爲空,或者不使用該選項, 意味着當前規則適用於所有的操作。
- yii\filters\AccessRule::controllers:指定該規則用於匹配哪些控制器。 它的值應爲控制器ID數組。匹配比較是大小寫敏感的。如果該選項爲空,或者不使用該選項, 則意味着當前規則適用於所有的操作。(譯者注:這個選項一般是在控制器的自定義父類中使用纔有意義)
- yii\filters\AccessRule::roles:指定該規則用於匹配哪些用戶角色。 系統自帶兩個特殊的角色,通過 yii\web\User::isGuest 來判斷:
?
: 用於匹配訪客用戶 (未經認證)@
: 用於匹配已認證用戶- 使用其他角色名時,將觸發調用 yii\web\User::can(),這時要求 RBAC 的支持 (在下一節中闡述)。 如果該選項爲空或者不使用該選項,意味着該規則適用於所有角色。
- yii\filters\AccessRule::ips:指定該規則用於匹配哪些 yii\web\Request::userIP 。 IP 地址可在其末尾包含通配符
*
以匹配一批前綴相同的IP地址。 例如,192.168.*
匹配所有192.168.
段的IP地址。 如果該選項爲空或者不使用該選項,意味着該規則適用於所有角色。 - yii\filters\AccessRule::verbs:指定該規則用於匹配哪種請求方法(例如
GET
,POST
)。 這裏的匹配大小寫不敏感。 - yii\filters\AccessRule::matchCallback:指定一個PHP回調函數用於 判定該規則是否滿足條件。(譯者注:此處的回調函數是匿名函數)
- yii\filters\AccessRule::denyCallback: 指定一個PHP回調函數, 當這個規則不滿足條件時該函數會被調用。(譯者注:此處的回調函數是匿名函數)
PS: 以上列表複製於Yii手冊.