YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例

这篇文章主要介绍了YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用,结合实例形式分析了YII2框架RBAC对模块,控制器,方法的权限控制及规则的使用相关原理与操作技巧,需要的朋友可以参考下

本文实例讲述了YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用。分享给大家供大家参考,具体如下:

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

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

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

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

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

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

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

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

IndexController.php代码如下:

 renderPartial('index'); } //登陆 public function actionLogin() { if (YII::$app->request->isPost) { $user = new MyUserLogin(); $user->load(YII::$app->request->post(), ''); if ($user->login()) { echo '登陆成功'; } else { echo '登陆失败'; } } else { return $this->renderPartial('login'); } } //为了演示,这里我们添加几条权限 public function actionPer() { $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); } //添加角色 public function actionRole() { $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')); } //给用户指派角色 public function actionAssign() { $auth = YII::$app->authManager; //注意这里的2是用户的ID,即你用户表user里的ID //也可通过YII::$app->user->id获取 $auth->assign($auth->getRole('admin'), 1); $auth->assign($auth->getRole('employee'), 2); } //添加规则 public function actionRule() { $auth = YII::$app->authManager; $rule = new UserUpdSelfRule(); $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,来实现用户只能修改自已信息的规则。

 

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

访问index/role结果如下:

访问index/assign结果如下:

访问index/rule结果如下:

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

BaseController.php代码如下:

 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('你没有权限'); } } return parent::beforeAction($action); } //检查是否在线 public function checkOnline() { return !empty(YII::$app->user->id) ? true : false; } } 

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

 request->get('id', 0); echo 'user id : ', YII::$app->user->id, '
'; //先判断用户有没有只能修改自已的权限 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 '修改所有'; } } public function actionDel() { echo 'user id : ', YII::$app->user->id, '
'; echo 'user del'; } public function actionList() { echo 'user id : ', YII::$app->user->id, '
'; echo 'user list'; } public function actionAdd() { echo 'user id : ', YII::$app->user->id, '
'; echo 'user add'; } }

我的用户表里有两个用户

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

admin用户状态如下:

test用户状态如下:

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

更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

以上就是YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » PHP编程