YII2.0框架(一)RBAC基于角色的权限控制源码透析yii\rbac\DbManager [ 2.0 版本 ]
摘自 http://www.yiichina.com/doc/guide/2.0/security-authorization
一、RBAC配置
这是配置RBAC的参数列表,我使用的是数据库的RBAC设置,可以根据文档配置数据表,或者使用文件里面的SQL表,配置好了就可以使用RBAC了,非常方便.
'authManager' => [
'class' => 'yii\rbac\DbManager', //使用数据库RBAC
'itemTable' => 'auth_item', //权限列表
'assignmentTable' => 'auth_assignment', //权限分配表
'itemChildTable' => 'auth_item_child', //权限父子关联表
'defaultRoles' => ['user'], //默认角色
],
二、RBAC初始化方法返回值
// 1.获得用户的角色列表
$getRolesByUser = $manager->getRolesByUser($userId); // []
// 2.获得当前角色的子角色列表
// $getChildRoles = $manager->getChildRoles($roleName); // 报错
// 3.通过角色获得权限列表
$getPermissionsByRole = $manager->getPermissionsByRole($roleName); // []
// 4.通过用户获得权限列表
$getPermissionsByUser = $manager->getPermissionsByUser($userId); // []
// 5.获得角色
$getRule = $manager->getRule($roleName); // null
// 6.获得角色列表
$getRules = $manager->getRules(); // []
// 7.获得用户某种角色的任务
$getAssignment = $manager->getAssignment($roleName, $userId); // null
// 8.获得用户所有角色的任务列表
$getAssignments = $manager->getAssignments($userId); // []
// 9.是否能添加子类
// $canAddChild = $manager->canAddChild($parent, $child);
三、基础RBAC使用需求分析
我们做下简单的需求分析
1.角色:管理员-admin 普通用户-user
2.权限:
(1)查看管理员列表-adminList
(2)新增管理员列表-adminInput
(3)查看用户列表-userList
(4)新增或修改用户列表-userInput
3.角色-权限:
管理员(1)(2)(3)(4)
用户(1)(3)
4.用户-角色
用户ID为1 分配 管理员-admin
用户ID为2 分配 普通用户-user
四、基础RBAC的使用(代码依次执行,请在各个断点打印数据查看)
// 1.添加权限【管理员列表】
// $adminList = $manager->createPermission('adminList');
// $adminList->description = '查看管理员列表';
// $manager->add($adminList);
// 2.添加权限【新增管理员】
// $adminInput = $manager->createPermission('adminInput');
// $adminInput->description = '新增管理员';
// $manager->add($adminInput);
// 3.添加角色【普通用户】
// $user = $manager->createRole('user');
// $user->description = '普通用户';
// $rs = $manager->add($user);
// 4.给普通用户分配【查看管理员列表】权限
// //(1)获得角色
// $parent = $manager->getRole('user');
// // (2)获得权限
// $child = $manager->getPermission('adminList');
// // (3)给角色添加权限
// if ($manager->canAddChild($parent, $child)) {
// // $manager->addChild($parent, $child);
// }
// 5.创建【管理员】并给管理员添加【新增管理员】权限
// $admin = $manager->createRole('admin');
// $admin->description = '超级管理员';
// $manager->add($admin);
// $adminInput = $manager->getPermission('adminInput');
// if ($manager->canAddChild($admin, $adminInput)) { // 是否可以添加子类
// $rs = $manager->addChild($admin, $adminInput);
// }
// 6.给管理员添加【普通用户角色】
$admin = $manager->getRole('admin');
$user = $manager->getRole('user');
// if ($manager->canAddChild($user, $admin)) {
// $rs = $manager->addChild($admin, $user);
// } else {
// throw new InvalidParamException('不能添加该子类');
// }
// 7.为用户分配角色 1-admin 2-user 1 2表示用户的唯一标识ID
// $manager->assign($admin, 1);
// $manager->assign($user, 2);
// 8.获得用户的角色
$getRolesByUser = $manager->getRolesByUser(1);
/*
[
'admin' => yii\rbac\Role#1
(
[type] => '1'
[name] => 'admin'
[description] => '超级管理员'
[ruleName] => null
[data] => null
[createdAt] => '1495869512'
[updatedAt] => '1495869512'
)
]
*/
// 9.获得用户的权限
$getPermissionsByUser = $manager->getPermissionsByUser(1);
五、高级RBAC的使用(添加规则)需求分析
1.普通用户可以编辑自己的个人资料
2.管理员可以修改所有用户个人资料
六、高级RBAC的使用
给普通用户分配【查看用户列表】权限,给管理员分配修改【用户个人资料】权限
// $userIndex = $manager->createPermission('userIndex');
// $userIndex->description = '查看用户列表';
// $manager->add($userIndex);
// $manager->addChild($user, $userIndex);
// $userInput = $manager->createPermission('userInput');
// $userInput->description = '修改用户个人资料';
// $manager->add($userInput);
// $manager->addChild($admin, $userInput);
// 1.添加规则
$authorRule = new \yii\rbac\AuthorRule();
// $rs = $manager->add($authorRule);
// 2.获得规则
$rule = $manager->getRule('isAuthor');
$rules = $manager->getRules();
// 3.创建权限
// $updateOwnData = $manager->createPermission('updateOwnData');
// $updateOwnData->description = '更新自己的个人资料';
// $manager->add($updateOwnData);
// 4.获得权限并关联规则,更新权限
$updateOwnData = $manager->getPermission('updateOwnData');
$updateOwnData->ruleName = $rule->name;
$manager->update($updateOwnData->name, $updateOwnData);
// 5.将【更新自己的个人资料】赋给【更新用户信息】
// $permissions = $manager->getPermissions();
// $manager->addChild($permissions['userInput'], $updateOwnData);
// 6.允许user更新自己的帖子
// $manager->addChild($user, $updateOwnData);
七、最终结果数据展示
// 1.获得当前角色的子角色列表
$getChildRoles = $manager->getChildRoles($roleName);
/*[
'admin' => yii\rbac\Role#1
(
[type] => '1'
[name] => 'admin'
[description] => '超级管理员'
[ruleName] => null
[data] => null
[createdAt] => '1495869512'
[updatedAt] => '1495869512'
)
'user' => yii\rbac\Role#2
(
[type] => '1'
[name] => 'user'
[description] => '普通用户'
[ruleName] => null
[data] => null
[createdAt] => '1495868344'
[updatedAt] => '1495868344'
)
]*/
// 2.通过角色获得权限列表
$getPermissionsByRole = $manager->getPermissionsByRole($getChildRoles['admin']->name);
/*[
'adminInput' => yii\rbac\Permission#1
(
[type] => '2'
[name] => 'adminInput'
[description] => '新增管理员'
[ruleName] => null
[data] => null
[createdAt] => '1495868191'
[updatedAt] => '1495868191'
)
'adminList' => yii\rbac\Permission#2
(
[type] => '2'
[name] => 'adminList'
[description] => '查看管理员列表'
[ruleName] => null
[data] => null
[createdAt] => '1495867991'
[updatedAt] => '1495867991'
)
'updateOwnData' => yii\rbac\Permission#3
(
[type] => '2'
[name] => 'updateOwnData'
[description] => '更新自己的个人资料'
[ruleName] => 'isAuthor'
[data] => null
[createdAt] => '1495872142'
[updatedAt] => '1495873951'
)
'userIndex' => yii\rbac\Permission#4
(
[type] => '2'
[name] => 'userIndex'
[description] => '查看用户列表'
[ruleName] => null
[data] => null
[createdAt] => '1495871384'
[updatedAt] => '1495871384'
)
'userInput' => yii\rbac\Permission#5
(
[type] => '2'
[name] => 'userInput'
[description] => '修改个人资料'
[ruleName] => null
[data] => null
[createdAt] => '1495873112'
[updatedAt] => '1495873112'
)
] */
// 3.通过用户获得权限列表
$getPermissionsByUser = $manager->getPermissionsByUser(2);
/*[
'adminList' => yii\rbac\Permission#1
(
[type] => '2'
[name] => 'adminList'
[description] => '查看管理员列表'
[ruleName] => null
[data] => null
[createdAt] => '1495867991'
[updatedAt] => '1495867991'
)
'updateOwnData' => yii\rbac\Permission#2
(
[type] => '2'
[name] => 'updateOwnData'
[description] => '更新自己的个人资料'
[ruleName] => 'isAuthor'
[data] => null
[createdAt] => '1495872142'
[updatedAt] => '1495874462'
)
'userIndex' => yii\rbac\Permission#3
(
[type] => '2'
[name] => 'userIndex'
[description] => '查看用户列表'
[ruleName] => null
[data] => null
[createdAt] => '1495871384'
[updatedAt] => '1495871384'
)
]*/
// 4.获得规则列表
$getRules = $manager->getRules();
/*[
'isAuthor' => yii\rbac\AuthorRule#1
(
[name] => 'isAuthor'
[createdAt] => 1495871846
[updatedAt] => 1495871846
)
] */
// 5.获得规则
$getRule = $manager->getRule($getRules['isAuthor']->name);
/* yii\rbac\AuthorRule#1
(
[name] => 'isAuthor'
[createdAt] => 1495871846
[updatedAt] => 1495871846
) */
// 6.获得用户角色列表
$getAssignments = $manager->getAssignments(1);
/*[
'admin' => yii\rbac\Assignment#1
(
[userId] => '1'
[roleName] => 'admin'
[createdAt] => '1495870195'
)
]*/
// 7.获得用户某种角色
$getAssignment = $manager->getAssignment('admin',1);
// yii\rbac\Assignment#1
// (
// [userId] => '1'
// [roleName] => 'admin'
// [createdAt] => '1495870195'
// )
// 8.获得所有子类
$getChildren = $manager->getChildren('userInput');
/*[
'updateOwnData' => yii\rbac\Permission#1
(
[type] => '2'
[name] => 'updateOwnData'
[description] => '更新自己的个人资料'
[ruleName] => 'isAuthor'
[data] => null
[createdAt] => '1495872142'
[updatedAt] => '1495875189'
)
]*/
// 9.返回指定角色的所有用户任务情况
$getUserIdsByRole = $manager->getUserIdsByRole('admin');
/*[
0 => '1'
]*/
八、RBAC删除操作
// // 10.撤销用户的某种角色
// $revoke = $manager->revoke($role, $userId);
// // 11.撤销用户的所有角色
// $revokeAll = $manager->revokeAll($userId);
// // 12.删除所有RBAC设置
// $removeAll = $manager->removeAll();
// // 13.删除所有权限
// $removeAllPermissions = $manager->removeAllPermissions();
luomao2012
注册时间:2017-05-26
最后登录:2019-03-07
在线时长:2小时10分
最后登录:2019-03-07
在线时长:2小时10分
- 粉丝1
- 金钱55
- 威望10
- 积分175
共 2 条评论
很不错 很清楚
角色表不能扩充字段,如果要做个启用、禁用角色功能咋实现呢