Yii權限管理

概述

授權是指驗證用戶是否允許做某件事的過程。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:指定該規則用於匹配哪種請求方法(例如GETPOST)。 這裏的匹配大小寫不敏感。
  • yii\filters\AccessRule::matchCallback:指定一個PHP回調函數用於 判定該規則是否滿足條件。(譯者注:此處的回調函數是匿名函數)
  • yii\filters\AccessRule::denyCallback: 指定一個PHP回調函數, 當這個規則不滿足條件時該函數會被調用。(譯者注:此處的回調函數是匿名函數)

PS: 以上列表複製於Yii手冊.

結語

ACF, 這種比較簡單的訪問授權控制, 適合用戶系統角色不多的應用. 例如前臺應用. 而後臺應用, 通常會出現大量不同角色進行管理. 此時ACF就力不從心了, 沒關係, 更強大的授權管理RBAC, 在Yii中也有很好的支持

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章