本文实例讲述了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代码如下:
<?phpnamespace app\controllers;u yii;u app\models\myurlogin;u app\rbac\urupdlfrule;u app\controllers\bacontroller;class indexcontroller extends bacontroller{ 生活处处有语文作文 //首页 public function actionindex() { $this->renderpartial('index'); } //登陆 public function actionlogin() { if (yii::$app->request->ispost) { $ur = new myurlogin(); $ur->load(yii::$app->request->post(), ''); if ($ur->login()) { echo '登陆成功'; } el { echo '登陆失败'; } } el { return $this->renderpartial('login'); } } //为了演示,这里我们添加几条权限 public function actionper() { $auth = yii::$app->authmanager; //创建用户删除权限 $per = $auth->createpermission('ur/del'); $per->description = '删除用户'; $auth->add($per); //创建用户更新权限 $per = $auth->createpermission('ur/upd'); $per->description = '更新用户'; $auth->add($per); //创建用户添加权限 $per = $auth->createpermission('ur/add'); $per->description = '添加用户'; $auth->add($per); //创建用户查看权限 五一节日问候$per = $auth->createpermission('ur/list'); $per->description = '查看用户列表'; $auth->add($per); } //添加角色 public function actionrole() { $auth = yii::$app->authmanager; //添加管理员角色 $admin = $auth->createrole('admin'); $admin->description = '管理员'; $auth->add($admin); //给管理员赋予权限 $auth->a奋战100天口号ddchild($admin, $auth->getpermission('ur/del')); $auth->addchild($admin, $auth->getpermission('ur/upd')); $auth->addchild($admin, $auth->getpermission('ur/add')); $auth->addchild($admin, $auth->getpermission('ur/list')); //添加普通员工角色 $employee = $auth->createrole('employee'); $employee->description = '普通员工'; $auth->add($employee); $auth->addchild($employee, $auth->getpermission('ur/list')); $auth->addchild($employee, $auth->getpermission('ur/add')); } //给用户指派角色 public function actionassign() { $auth = yii::$app->authmanager; //注意这里的2是用户的id,即你用户表ur里的id //也可通过yii::$app->ur->id获取 $auth->assign($auth->getrole('admin'), 1); $auth->assign($auth->getrole('employee'), 2); } //添加规则 public function actionrule() { $auth = yii::$app->authmanager; $rule = new urupdlfrule(); $auth->add($rule); //创建权限,与规则关联 $per = $auth->createpermission('ur/upd/updlf'); $per->description = '用户只能修改自已'; $per->rulename = $rule->name; $auth->add($per); //这里,要注意,要把ur/upd/updlf权限设为ur/upd的父级 //要不然,普通员工访问ur/upd这个方法会被拦住 $auth->addchild($per, $auth->getpermission('ur/upd')); //给普通员工赋予ur/upd/updlf权限,注意我们这里并没有给员工赋予ur/upd权限 $auth->addchild($auth->getrole('employee'), $per); }}
我们在项目目录下创建rbac目录,并创建urupdlfrule.php,来实现用户只能修改自已信息的规则。
<?php//注意命名空间要跟你的目录对应namespace app\rbac;u yii\rbac\rule;//必须继承自yii\rbac\ruleclass urupdlfrule extends rule{ public $name = 'urupdlf'; //必须要实现execute方法 //$ur表示用户id //$item规则相关的角色或者权限 //$params传递过来的参数 public function execute($ur, $item, $params) { //如果没有设置参数id,直接返回true if (!ist($params['id'])) { return true; } //判断id是否是当前用户id return ($params['id'] == $ur) ? true : fal; }}
我们访问index/per查看数据表中的变化。
访问index/role结果如下:
访问index/assign结果如下:
访问index/rule结果如下:
为了中南林业大学涉外学院能够对我们的模块,控制器,方法进行权限控制,我们需要创建一个基类来统一处理,上面的控制器就是继承自基类。
bacontroller.php代码如下:
<?phpnamespace app\controllers;u yii;u yii\web\controller;class bacontroller extends controller{ //不需要验证的 protected $nocheckaccess = [ 'index/index', 'index/per', 'index/role', 'index/assign', 'index/rule', 'index/login', ]; //不需要登陆的 protected $nologin = [ 'index/login', ]; //验证权限 //注意,不要把获取模块名,控制器名,方法名写到init()函数里,那样是获取不到的 //这个坑我已经踩了,大家就不用再去踩了 public function beforeaction($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}"; } el { $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->ur->can($per)) { die('你没有权限'); } } return parent::beforeaction($action); } //检查是否在线 public function checkonline() { return !empty(yii::$app->ur->id) ? true : fal; }}
为了演示,我们创建一个urcontroller.php,代码如下:
<?phpnamespace app\controllers;u yii;u app\controllers\bacontroller;class urcontroller extends bacontroller{ public function actionupd() { $id = yii::$app->request->get('id', 0); echo 'ur id : ', yii::$app->ur->id, '<br>'; //先判断用户有没有只能修改自已的权限 if (yii::$app->ur->can('ur/upd/updlf')) { //然后再判静谧的意思断修改id是否与自已的id一样,在urupdlfrule里进行判断 if (yii::$app->ur->can('ur/upd/updlf', ['id' => $id])) { echo '有权修改自已'; } el { echo '不能修改除自已以外的'; } } el { echo '修改所有'; } } public function actiondel() { echo 'ur id : ', yii::$app->ur->id, '<br>'; echo 'ur del'; } public function actionlist() { echo 'ur id : ', yii::$app->ur->id, '<br>'; echo 'ur list'; } public function actionadd() { echo 'ur id : ', yii::$app->ur->id, '<br>'; echo 'ur add'; }}
我的用户表里有两个用户
分别登陆这两个用户,然后让他们访问ur/add,ur/del,ur/list,ur/upd,结果如下:
admin用户状态如下:
test用户状态如下:
test之所以能够访问ur/upd是因为我们把ur/upd/updlf设为了ur/upd的父级,如果没有设置,这里是会被拦住的。
本文发布于:2023-04-08 19:41:21,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/aa270214f3b7bca922a1515fc3938c00.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例.doc
本文 PDF 下载地址:YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例.pdf
留言与评论(共有 0 条评论) |