luomao2012 2017-05-27 20:52:16 4000次浏览 2条评论 9 1 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)(34.用户-角色
	用户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();
觉得很赞
您需要登录后才可以评论。登录 | 立即注册