這里有幾個概念很重要,我簡單用大白話說一下;
權限:
就是指用戶是否可以執行哪些操作。
如:小張可以發帖、回帖、瀏覽,小紅只能回帖、瀏覽
角色:
就是上面說的一組操作的集合。
如:高級會員有發帖、回帖、刪貼、瀏覽的權限,普通會員只有回帖、瀏覽的權限。
比如小張是高級會員,那么他就可以執行發帖、回帖、刪貼、瀏覽。而小紅是普通會員,所以它就只能回帖、瀏覽。
另外角色還可以繼承,中級會員除了普通會員的回帖、瀏覽功能外,還可以發帖。也就是說在普通會員的基礎上又增加了一個發帖的權限。
在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中文開發向導——目錄