怎么在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查看数据表中的变化。
访问index/role结果如下:
访问index/assign结果如下:
访问index/rule结果如下:
为了能够对我们的模块,控制器,方法进行权限控制,我们需要创建一个基类来统一处理,上面的控制器就是继承自基类。
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'; } }
我的用户表里有两个用户
分别登陆这两个用户,然后让他们访问user/add,user/del,user/list,user/upd,结果如下:
admin用户状态如下:
test用户状态如下:
test之所以能够访问user/upd是因为我们把user/upd/updSelf设为了user/upd的父级,如果没有设置,这里是会被拦住的。
上述就是小编为大家分享的怎么在YII2框架中使用RBAC控制模块了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。
推荐阅读
-
怎么在Yii2中实现关联查询
今天就跟大家聊聊有关怎么在Yii2中实现关联查询,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据...
-
怎么在YII2框架中利用UEditor编辑器发布文章
今天就跟大家聊聊有关怎么在YII2框架中利用UEditor编辑器发布文章,可能很多人都不太了解,为了让大家更加了解,小编给大家总结...
-
如何在YII2框架中使用behavior
-
怎么在YII2框架中使用ActiveDataProvider和GridView
-
怎么在YII2框架中使用控制台命令
-
如何在YII2框架中使用Query()查询生成器
这篇文章将为大家详细讲解有关如何在YII2框架中使用Query()查询生成器,文章内容质量较高,因此小编分享给大家做个参考,希望大...
-
YII2全局异常处理的示例分析