Yii2-权限控制RBAC-应用篇(二)

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

'authManager' => [   
     'class' => 'yii\rbac\DbManager',    
     'itemTable' => 'auth_item',    
     'assignmentTable' => 'auth_assignment',    
     'itemChildTable' => 'auth_item_child',
],

2.生成rbac默认数据表

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

yii migrate --migrationPath=@yii/rbac/migrations/

 b.也可以打开vendor\yiisoft\yii2\rbac\migrations\schema-mysql.sql 拷贝里面的内容到数据库运行生成数据表


3.添加角色和权限

a.创建权限

public function createPermission($name)
{    
    $auth = Yii::$app->authManager;    
    $createPost = $auth->createPermission($name);    
    $createPost->description = '创建了 ' . $name. ' 权限';    
    $auth->add($createPost);
}

b.创建角色

public function createRole($name)
{    
    $auth = Yii::$app->authManager;    
    $role = $auth->createRole($name);    
    $role->description = '创建了 ' . $name. ' 角色';    
    $auth->add($role);
}

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

    public function add($object)
    {
        if ($object instanceof Item) {
            return $this->addItem($object);
        } elseif ($object instanceof Rule) {
            return $this->addRule($object);
        } else {
            throw new InvalidParamException("Adding unsupported object type.");
        }
    }

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



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

a.将权限赋给角色

public function addChild($items)
{    
    $auth = Yii::$app->authManager;    
    $parent = $auth->createRole($items['role']);                //创建角色对象
    $child = $auth->createPermission($items['permission']);     //创建权限对象
    $auth->addChild($parent, $child);                           //添加对应关系
}

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

b.将角色赋给用户

public function addChild($items)
{    
    $auth = Yii::$app->authManager;    
    $role = $auth->createRole($items['role']);                //创建角色对象
    $user_id = 1;                                             //获取用户id,此处假设用户id=1
    $auth->assign($role, $user_id);                           //添加对应关系
}

5.验证权限

public function beforeAction($action)
{    
    $action = Yii::$app->controller->action->id;
    if(\Yii::$app->user->can($action)){
        return true;
    }else{
        throw new \yii\web\UnauthorizedHttpException('对不起,您现在还没获此操作的权限');
    }
}

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

public function can($permissionName, $params = [], $allowCaching = true)
{
    if ($allowCaching && empty($params) && isset($this->_access[$permissionName])) {
        return $this->_access[$permissionName];
    }
    $access = $this->getAuthManager()->checkAccess($this->getId(), $permissionName, $params);
    if ($allowCaching && empty($params)) {
        $this->_access[$permissionName] = $access;
    }

    return $access;
}



  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值