天天看点

YII2.0框架(五) RBAC基于角色的权限控制yii\rbac\DbManager

一、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();      

继续阅读