• Yii 框架的Rbac [权限控制]


    转载自 xmlife 的博客 : http://blog.csdn.net/xmlife/article/details/50733451

    1.首先我们要在配置文件的组件(component)里面配置一下 Rbac

    [php] view plain copy
    1. ‘authManager’ => [
    2.      ‘class’ => ‘yii bacDbManager’,
    3.      ‘itemTable’ => ‘auth_item’,
    4.      ‘assignmentTable’ => ‘auth_assignment’,
    5.      ‘itemChildTable’ => ‘auth_item_child’,
    6. ],

    2.生成rbac默认数据表

    a.运行下面的命令生成权限数据表:

    yii migrate --migrationPath=@yii/rbac/migrations/
    b.也可以打开vendoryiisoftyii2 bacmigrationsschema-MySQL.sql 拷贝里面的内容到数据库运行生成数据表


    3.添加角色和权限

    a.创建权限

    [php] view plain copy
    1. public function createPermission($name)
    2. {
    3.     $auth = Yii::$app->authManager;
    4.     $createPost = $auth->createPermission($name);
    5.     $createPost->description = ‘创建了 ‘ . $name. ‘ 权限’;
    6.     $auth->add($createPost);
    7. }

    b.创建角色

    [php] view plain copy
    1. public function createRole($name)
    2. {
    3.     $auth = Yii::$app->authManager;
    4.     $role = $auth->createRole($name);
    5.     $role->description = ‘创建了 ‘ . $name. ‘ 角色’;
    6.     $auth->add($role);
    7. }

    以上两条添加,会创auth_item表中创建两条记录,以表中的type类型作为区分,type=1是角色,type=2为权限

    [php] view plain copy
    1.     public function add($object)
    2.     {
    3.         if ($object instanceof Item) {
    4.             return $this->addItem($object);
    5.         } elseif ($object instanceof Rule) {
    6.             return $this->addRule($object);
    7.         } else {
    8.             throw new InvalidParamException(“Adding unsupported object type.”);
    9.         }
    10.     }

    add方法会根据你传入的对象属性进行添加(添加角色和权限都是addItem,因为createPermission和createRole都创建了一个Item对象,只是对象中的type值不同)


    4.添加用户、角色和权限之间的关系

    a.将权限赋给角色

    [php] view plain copy
    1. public function addChild($items)
    2. {
    3.     $auth = Yii::$app->authManager;
    4.     $parent = $auth->createRole($items[‘role’]);                //创建角色对象
    5.     $child = $auth->createPermission($items[‘permission’]);     //创建权限对象
    6.     $auth->addChild($parent, $child);                           //添加对应关系
    7. }

    注意:上面创建的角色和权限对象,必须已经在数据库中创建,比如items[‘role’] = test,否则会报错

    b.将角色赋给用户

    [php] view plain copy
    1. public function addChild($items)
    2. {
    3.     $auth = Yii::$app->authManager;
    4.     $role = $auth->createRole($items[‘role’]);                //创建角色对象
    5.     $user_id = 1;                                             //获取用户id,此处假设用户id=1
    6.     $auth->assign($role, $user_id);                           //添加对应关系
    7. }

    5.验证权限

    [php] view plain copy
    1. public function beforeAction($action)
    2. {
    3.     $action = Yii::$app->controller->action->id;
    4.     if(Yii::$app->user->can($action)){
    5.         return true;
    6.     }else{
    7.         throw new yiiwebUnauthorizedHttpException(‘对不起,您现在还没获此操作的权限’);
    8.     }
    9. }

    看下Yii::$app->user->can()这个方法

    [php] view plain copy
    1. public function can($permissionName, $params = [], $allowCaching = true)
    2. {
    3.     if ($allowCaching && empty($params) && isset($this->_access[$permissionName])) {
    4.         return $this->_access[$permissionName];
    5.     }
    6.     $access = $this->getAuthManager()->checkAccess($this->getId(), $permissionName, $params);
    7.     if ($allowCaching && empty($params)) {
    8.         $this->_access[$permissionName] = $access;
    9.     }
    10.     return $access;
    11. }

    =============================================================

    Yii2-权限控制RBAC-实例篇(三)

    分类:

    思路解说:

    首先,我们约定以Controller/Action这样的格式作为有效的权限名称,直接将权限赋给用户,最后在can这个方法中做校验。为了不破坏源码,我们可以在ActiveRecord之前加一层基础控制器BaseController,普通控制器继承BaseController。

    方案一

    创建权限:

    那么我们建立对应的权限数据(如何创建在RBAC第二篇中已经详细讲解)

    权限post/detail:文章详情页的权限

    权限赋给用户:

    将权限直接赋给用户(此处用户ID为1)

    检测权限:

    在基础控制器中的beforeAction中验证权限:

    [php] view plain copy
    1. public function beforeAction($action)
    2. {
    3.     if (!parent::beforeAction($action)) {
    4.         return false;
    5.     }
    6.     $controller = Yii::$app->controller->id;
    7.     $action = Yii::$app->controller->action->id;
    8.     $permissionName = $controller.‘/’.$action;
    9.     if(!Yii::$app->user->can($permissionName) && Yii::$app->getErrorHandler()->exception === null){
    10.         throw new yiiwebUnauthorizedHttpException(‘对不起,您现在还没获此操作的权限’);
    11.     }
    12.     return true;
    13. }

    注意:

    [php] view plain copy
    1. Yii::$app->getErrorHandler()->exception === null

    这个必须要加,不然会报错,至于为什么就不多说了,简称一言难尽,V_V

    方案二(代码就不赘述了跟上面差不多)

    权限赋给角色,角色赋给用户

    创建角色:

    还是之前的权限[post/detail],去掉权限和用户关联,添加权限和角色的上下级关联

    将角色赋给用户

    检测权限

    效果于上面保持一致

  • 相关阅读:
    Git小结---So far.......
    Git命令之:git push
    Git详解之:Git分支
    使用Dom4j解析XML
    crm客户资源显示控制
    crm---本项目的权限控制模式
    在mybatis中,在列表分页查询过程中造成集合属性数据丢失的问题
    在easyui中解决使west和center为1:1,并且拖动窗口时能够自适应变化
    在springmvc中使用requestContextListener获取全部的request对象
    HTML 元素标签语义化及使用场景
  • 原文地址:https://www.cnblogs.com/xiaotaoing/p/6687426.html
Copyright © 2020-2023  润新知