yii2怎么實現rbac

yii2怎么實現rbac

RBAC(Role-Based Access Control )基于角色的訪問控制。

1.基本思想:在用戶和訪問權限之間引入角色的概念,將用戶和角色聯系起來,通過對角色的授權來控制用戶對系統資源的訪問,相對傳統訪問控制 引入角色極大地簡化了權限的管理。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(推薦學習:yii框架

1).角色:可以理解為一定數量的權限的集合,權限的載體。例如:一個論壇系統,“超級管理員”、“版主”都是角色。

2).權限:版主可管理版內的帖子、可管理版內的用戶等,這些是權限。?

Yii2中對rbac的實現

1.Yii2實現了通用的分層的RBAC,遵循的模型也是NIST RBAC model。

2.在yii2中增加了rule規則的概念,rule是什么鬼呢?

舉個栗子:對于文章系統而言,我們有管理員和普通用戶,允許管理員對文章的任何操作,但是只允許普通用戶創建文章和修改自己創建的文章,也就是說普通用戶是有修改文章的權限的,但是額加的限制條件是只能修改自己的文章,這個額加的驗證工作就是rule規則所要負責的事情。

3.yii2的權限管理實現支持文件和db兩個載體,基于db實現方式的核心是四個表:

1)存儲角色或權限的表:auth_item (type:1表示 角色;2表示權限)

CREATE?TABLE?`auth_item`?( `name`?varchar(64)?NOT?NULL, `type`?int(11)?NOT?NULL, `description`?text, `rule_name`?varchar(64)?default?NULL, `data`?text, `created_at`?int(11)?DEFAULT?NULL, `updated_at`?int(11)?DEFAULT?NULL, PRIMARY?KEY?(`name`), KEY?`rule_name`?(`rule_name`), KEY?`type`?(`type`), CONSTRAINT?`auth_item_ibfk_1`?FOREIGN?KEY?(`rule_name`)?REFERENCES?`auth_rule`?(`name`)?ON?DELETE?SET?NULL?ON?UPDATE?CASCADE )?ENGINE=InnoDB?DEFAULT?CHARSET=utf8

2) 權限和角色的上下級關聯表:auth_item_child

(包含關系:角色 可以包含 角色、角色 可以包含 權限、權限 可以包含 權限,但 權限 不可包含 角色)

CREATE?TABLE?`auth_item_child`?( `parent`?varchar(64)?NOT?NULL, `child`?varchar(64)?NOT?NULL, PRIMARY?KEY?(`parent`,`child`), KEY?`child`?(`child`), CONSTRAINT?`auth_item_child_ibfk_1`?FOREIGN?KEY?(`parent`)?REFERENCES?`auth_item`?(`name`)?ON?DELETE?CASCADE?ON?UPDATE?CASCADE, CONSTRAINT?`auth_item_child_ibfk_2`?FOREIGN?KEY?(`child`)?REFERENCES?`auth_item`?(`name`)?ON?DELETE?CASCADE?ON?UPDATE?CASCADE )?ENGINE=InnoDB?DEFAULT?CHARSET=utf8

3)用戶與權限(角色)的分配表:auth_assignment

CREATE?TABLE?`auth_assignment`?( `item_name`?varchar(64)?NOT?NULL, `user_id`?varchar(64)?NOT?NULL, `created_at`?int(11)?DEFAULT?NULL, PRIMARY?KEY?(`item_name`,`user_id`), CONSTRAINT?`auth_assignment_ibfk_1`?FOREIGN?KEY?(`item_name`)?REFERENCES?`auth_item`?(`name`)?ON?DELETE?CASCADE?ON?UPDATE?CASCADE )?ENGINE=InnoDB?DEFAULT?CHARSET=utf8

4)規則表:auth_rule

CREATE?TABLE?`auth_rule`?(?? ??`name`?varchar(64)?NOT?NULL,?? ??`data`?text,??//存的是一個序列化的實現了yiirbacRule接口的類的一個對象實例 ??`created_at`?int(11)?DEFAULT?NULL,?? ??`updated_at`?int(11)?DEFAULT?NULL,?? ??PRIMARY?KEY?(`name`),?? ??KEY?`name`?(`name`),?? ??KEY?`created_at`?(`created_at`),?? ??KEY?`updated_at`?(`updated_at`)?? )?ENGINE=InnoDB?DEFAULT?CHARSET=utf8?COMMENT='權限規則表';

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享