Yii2.0中文開發向導——RBAC(基於角色的訪問控制權限)表結構原理分析


 

這里有幾個概念很重要,我簡單用大白話說一下;

權限:
就是指用戶是否可以執行哪些操作。

如:小張可以發帖、回帖、瀏覽,小紅只能回帖、瀏覽

角色:
就是上面說的一組操作的集合。

如:高級會員有發帖、回帖、刪貼、瀏覽的權限,普通會員只有回帖、瀏覽的權限。
比如小張是高級會員,那么他就可以執行發帖、回帖、刪貼、瀏覽。而小紅是普通會員,所以它就只能回帖、瀏覽。

另外角色還可以繼承,中級會員除了普通會員的回帖、瀏覽功能外,還可以發帖。也就是說在普通會員的基礎上又增加了一個發帖的權限。


在Yii2.0中

  • yii\rbac: Item 為角色或者權限的基類,其中用字段type來標識
  • yii\rbac: Role 為代表角色的類
  • yii\rbac: Permission 為代表權限的類
  • yii\rbac: Assignment 為代表用戶角色或者權限的類
  • yii\rbac: Rule 為代表角色或權限能否執行的判定規則表



存儲角色或權限的表:auth_item

由於它們的數據存儲在一張表[auth_item]里面,所以他們有一個共同的基類yii\rbac:Item,用$type字段來標識是角色還是權限。
<ignore_js_op> 
從上面可以看到,上面的三個是用戶角色,下面的五個是權限。


角色權限關聯表:auth_item_child

上面我們說過,角色是一組權限的集合,所以還有一個表[auth_item_child]用來保存角色和權限的關系。

寫幾個測試數據會看的更明白,現在我們在表auth_item_child中指定它們的關系

   parent                    child
hight_user                  add
hight_user                  edit
hight_user                  delete
......
low_user                     reply
low_user                     view
..................
middle_user                low_user
middle_user                add

 


hight_user和low_user的關系我們容易理解,middle_user就不一樣了,它指定了另外一個角色:low_user和一個權限:add
這個意思就是說middle_user包含了low_user的權限,另外又添加了一個add權限。

除了角色可以包含角色外,權限也是可以包含權限的。也就是說這個表里面有三個關系:

  • 角色 包含 權限
  • 角色 包含 角色
  • 權限 包含 權限


如果要得到一個角色的所有的權限,要做兩方面的查找,一個是遞歸查找當前權限所有的子權限, 一個是查看所包含的角色的所有的權限以及子權限。
所以在使用中不建議讓權限繼承,只讓角色繼承。而且繼承深度也不宜太深。

最重要的也就是上面這兩個表,具體的代碼是怎么實現的會在后面源碼分析里面說明。


用戶角色(權限)表:[auth_assignment]

這個表用來存儲用戶的角色或者權限。

為什么是角色或者權限

如上面,給角色指定權限有兩種辦法

  • 一種是直接給角色指定相應的權限
  • 一種是讓一個角色繼承(我始終覺的繼承這個詞要好於包含)自另外一個角色,另外還可以再單獨指定其它的權限。


所以對用戶而言也有兩種方法。

  • 一種是給用戶指定相應的角色
  • 一種是給用戶指定相應的權限。


<ignore_js_op> 
這樣一個用戶的權限包含兩部分,一部分是所指定的角色代表的權限,一部分就是直接所指定的權限。


規則表:[auth_rule]

一個用戶要執行一個操作除了要看他有沒有這個權限外,還要看他的這個權限能不能執行。

在上面的表:auth_item中還有一個字段:[rule_name]。這個字段用來標明這個角色或者權限能不能成功執行。

那么規則這個表里面的數據是從哪里來的呢?
下面這個是規則的基類:

abstract class Rule extends Object
{
    /**
     * @var string name of the rule
     */
    public $name;
    /**
     * @var integer UNIX timestamp representing the rule creation time
     */
    public $createdAt;
    /**
     * @var integer UNIX timestamp representing the rule updating time
     */
    public $updatedAt;

    /**
     * Executes the rule.
     *
     * @param Item $item the auth item that this rule is associated with
     * @param array $params parameters passed to [[ManagerInterface::allow()]].
     * @return boolean a value indicating whether the rule permits the auth item it is associated with.
     */
    abstract public function execute($item, $params);
}

 


$name為規則的名稱。
也就是說如果要在規則表:[auth_rule]中增加一條規則就得要有對應的規則類,並實現方法abstract public function execute($item, $params)具體的邏輯來判定$item(角色或者權限)是否可執行。

主要的分析也就完成了。關於這一部分的源碼分析,過幾天也會出來的。
哪一部分沒說清楚或者還有其它問題都可以留言討論。謝謝各位。喜歡的就頂一下。


原文鏈接:http://www.yiifans.com/forum.php?mod=viewthread&tid=74#lastpost


Yii2.0中文開發向導——目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM