怎么在YII2框架中使用RBAC控制模块

这期内容当中小编将会给大家带来有关怎么在YII2框架中使用RBAC控制模块,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

在使用YII2中自带的RBAC时,需要先配置config/web.php:

return[
//...
'components'=>[
'authManager'=>[
'class'=>'yii\rbac\DbManager',
],
//...
],
];

如果你需要运行yii migrate来创建表,那么config/console.php也需要同上面一样配置一下。

cmd进入项目目录,运行如下命令:

yiimigrate--migrationPath=@yii/rbac/migrations

你会发现在数据库中创建了四张表

auth_assignment角色与用户的关联表
auth_item存放角色与权限,通过type字段区分
auth_item_child存放角色与权限的上下级关系
auth_rule规则表,用于扩展权限功能

为了演示,我们在控制器下分别写四个方法,分别用来创建权限,创建角色,指派角色,使用规则。

IndexController.php代码如下:

<?php

namespaceapp\controllers;

useYII;
useapp\models\MyUserLogin;
useapp\rbac\UserUpdSelfRule;
useapp\controllers\BaseController;

classIndexControllerextendsBaseController
{

//首页
publicfunctionactionIndex()
{
$this->renderPartial('index');
}

//登陆
publicfunctionactionLogin()
{
if(YII::$app->request->isPost){
$user=newMyUserLogin();
$user->load(YII::$app->request->post(),'');

if($user->login()){
echo'登陆成功';
}else{
echo'登陆失败';
}

}else{
return$this->renderPartial('login');
}
}

//为了演示,这里我们添加几条权限
publicfunctionactionPer()
{
$auth=YII::$app->authManager;
//创建用户删除权限
$per=$auth->createPermission('user/del');
$per->description='删除用户';
$auth->add($per);
//创建用户更新权限
$per=$auth->createPermission('user/upd');
$per->description='更新用户';
$auth->add($per);
//创建用户添加权限
$per=$auth->createPermission('user/add');
$per->description='添加用户';
$auth->add($per);
//创建用户查看权限
$per=$auth->createPermission('user/list');
$per->description='查看用户列表';
$auth->add($per);
}

//添加角色
publicfunctionactionRole()
{
$auth=YII::$app->authManager;

//添加管理员角色
$admin=$auth->createRole('admin');
$admin->description='管理员';
$auth->add($admin);
//给管理员赋予权限
$auth->addChild($admin,$auth->getPermission('user/del'));
$auth->addChild($admin,$auth->getPermission('user/upd'));
$auth->addChild($admin,$auth->getPermission('user/add'));
$auth->addChild($admin,$auth->getPermission('user/list'));

//添加普通员工角色
$employee=$auth->createRole('employee');
$employee->description='普通员工';
$auth->add($employee);
$auth->addChild($employee,$auth->getPermission('user/list'));
$auth->addChild($employee,$auth->getPermission('user/add'));
}

//给用户指派角色
publicfunctionactionAssign()
{
$auth=YII::$app->authManager;

//注意这里的2是用户的ID,即你用户表user里的ID
//也可通过YII::$app->user->id获取
$auth->assign($auth->getRole('admin'),1);

$auth->assign($auth->getRole('employee'),2);
}

//添加规则
publicfunctionactionRule()
{
$auth=YII::$app->authManager;
$rule=newUserUpdSelfRule();
$auth->add($rule);

//创建权限,与规则关联
$per=$auth->createPermission('user/upd/updSelf');
$per->description='用户只能修改自已';
$per->ruleName=$rule->name;
$auth->add($per);

//这里,要注意,要把user/upd/updSelf权限设为user/upd的父级
//要不然,普通员工访问user/upd这个方法会被拦住
$auth->addChild($per,$auth->getPermission('user/upd'));
//给普通员工赋予user/upd/updSelf权限,注意我们这里并没有给员工赋予user/upd权限
$auth->addChild($auth->getRole('employee'),$per);
}
}

我们在项目目录下创建rbac目录,并创建UserUpdSelfRule.php,来实现用户只能修改自已信息的规则。

<?php

//注意命名空间要跟你的目录对应
namespaceapp\rbac;

useyii\rbac\Rule;

//必须继承自yii\rbac\Rule
classUserUpdSelfRuleextendsRule
{
public$name='userUpdSelf';

//必须要实现execute方法
//$user表示用户ID
//$item规则相关的角色或者权限
//$params传递过来的参数
publicfunctionexecute($user,$item,$params)
{
//如果没有设置参数ID,直接返回true
if(!isset($params['id'])){
returntrue;
}
//判断id是否是当前用户ID
return($params['id']==$user)?true:false;
}
}

我们访问index/per查看数据表中的变化。

怎么在YII2框架中使用RBAC控制模块

访问index/role结果如下:

怎么在YII2框架中使用RBAC控制模块

访问index/assign结果如下:

怎么在YII2框架中使用RBAC控制模块

访问index/rule结果如下:

怎么在YII2框架中使用RBAC控制模块

为了能够对我们的模块,控制器,方法进行权限控制,我们需要创建一个基类来统一处理,上面的控制器就是继承自基类。

BaseController.php代码如下:

<?php

namespaceapp\controllers;

useYII;
useyii\web\Controller;

classBaseControllerextendsController
{
//不需要验证的
protected$noCheckAccess=[
'index/index',
'index/per',
'index/role',
'index/assign',
'index/rule',
'index/login',
];

//不需要登陆的
protected$noLogin=[
'index/login',
];

//验证权限
//注意,不要把获取模块名,控制器名,方法名写到init()函数里,那样是获取不到的
//这个坑我已经踩了,大家就不用再去踩了
publicfunctionbeforeAction($action)
{
$mid=!empty($this->module->id)?$this->module->id:'';
$cid=!empty($this->id)?$this->id:'';
$aid=!empty($action->id)?$action->id:'';

//如果模块为basic,我们只验证控制器/方法
if($mid=='basic'){
$per="{$cid}/{$aid}";
}else{
$per="{$mid}/{$cid}/{$aid}";
}

if(!in_array($per,$this->noLogin)){
if(!$this->checkOnline()){
$this->redirect('index/login');
}
}

if(!in_array($per,$this->noCheckAccess)){
if(!YII::$app->user->can($per)){
die('你没有权限');
}
}

returnparent::beforeAction($action);
}

//检查是否在线
publicfunctioncheckOnline()
{
return!empty(YII::$app->user->id)?true:false;
}
}

为了演示,我们创建一个UserController.php,代码如下:

<?php

namespaceapp\controllers;

useYII;
useapp\controllers\BaseController;

classUserControllerextendsBaseController
{
publicfunctionactionUpd()
{
$id=YII::$app->request->get('id',0);

echo'userid:',YII::$app->user->id,'<br>';

//先判断用户有没有只能修改自已的权限
if(YII::$app->user->can('user/upd/updSelf')){
//然后再判断修改ID是否与自已的ID一样,在UserUpdSelfRule里进行判断
if(YII::$app->user->can('user/upd/updSelf',['id'=>$id])){
echo'有权修改自已';
}else{
echo'不能修改除自已以外的';
}
}else{
echo'修改所有';
}
}

publicfunctionactionDel()
{
echo'userid:',YII::$app->user->id,'<br>';
echo'userdel';
}

publicfunctionactionList()
{
echo'userid:',YII::$app->user->id,'<br>';
echo'userlist';
}

publicfunctionactionAdd()
{
echo'userid:',YII::$app->user->id,'<br>';
echo'useradd';
}
}

我的用户表里有两个用户

怎么在YII2框架中使用RBAC控制模块

分别登陆这两个用户,然后让他们访问user/add,user/del,user/list,user/upd,结果如下:

admin用户状态如下:

怎么在YII2框架中使用RBAC控制模块

test用户状态如下:

怎么在YII2框架中使用RBAC控制模块

test之所以能够访问user/upd是因为我们把user/upd/updSelf设为了user/upd的父级,如果没有设置,这里是会被拦住的。

上述就是小编为大家分享的怎么在YII2框架中使用RBAC控制模块了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。

发布于 2021-03-21 22:38:46
收藏
分享
海报
0 条评论
172
上一篇:怎么在YII2框架中使用ActiveDataProvider和GridView 下一篇:怎么在CMD命令行中使用管道命令
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码