当前位置:首页 > CMS教程 > 其它CMS > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-21 09:10:14 浏览: 评论:0 

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

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

  1. return [ 
  2.   // ... 
  3.   'components' => [ 
  4.     'authManager' => [ 
  5.       'class' => 'yii\rbac\DbManager'
  6.     ], 
  7.     // ... 
  8.   ], 
  9. ]; 

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

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

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

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

auth_assignment 角色与用户的关联表

auth_item 存放角色与权限,通过type字段区分

auth_item_child 存放角色与权限的上下级关系

auth_rule 规则表,用于扩展权限功能

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

IndexController.php代码如下:

  1. <?php 
  2.  
  3. namespace app\controllers; 
  4.  
  5. use YII; 
  6. use app\models\MyUserLogin; 
  7. use app\rbac\UserUpdSelfRule; 
  8. use app\controllers\BaseController; 
  9.  
  10. class IndexController extends BaseController 
  11.  
  12.   //首页 
  13.   public function actionIndex() 
  14.   { 
  15.     $this->renderPartial('index'); 
  16.   } 
  17.  
  18.   //登陆 
  19.   public function actionLogin() 
  20.   { 
  21.     if (YII::$app->request->isPost) { 
  22.       $user = new MyUserLogin(); 
  23.       $user->load(YII::$app->request->post(), ''); 
  24.  
  25.       if ($user->login()) { 
  26.         echo '登陆成功'
  27.       } else { 
  28.         echo '登陆失败'
  29.       } 
  30.  
  31.     } else { 
  32.       return $this->renderPartial('login'); 
  33.     } 
  34.   } 
  35.  
  36.   //为了演示,这里我们添加几条权限 
  37.   public function actionPer() 
  38.   { 
  39.     $auth = YII::$app->authManager; 
  40.     //创建用户删除权限 
  41.     $per = $auth->createPermission('user/del'); 
  42.     $per->description = '删除用户'
  43.     $auth->add($per); 
  44.     //创建用户更新权限 
  45.     $per = $auth->createPermission('user/upd'); 
  46.     $per->description = '更新用户'
  47.     $auth->add($per); 
  48.     //创建用户添加权限 
  49.     $per = $auth->createPermission('user/add'); 
  50.     $per->description = '添加用户'
  51.     $auth->add($per); 
  52.     //创建用户查看权限 
  53.     $per = $auth->createPermission('user/list'); 
  54.     $per->description = '查看用户列表'
  55.     $auth->add($per); 
  56.   } 
  57.  
  58.   //添加角色 
  59.   public function actionRole() 
  60.   { 
  61.     $auth = YII::$app->authManager; 
  62.  
  63.     //添加管理员角色 
  64.     $admin = $auth->createRole('admin'); 
  65.     $admin->description = '管理员'
  66.     $auth->add($admin); 
  67.     //给管理员赋予权限 
  68.     $auth->addChild($admin$auth->getPermission('user/del')); 
  69.     $auth->addChild($admin$auth->getPermission('user/upd')); 
  70.     $auth->addChild($admin$auth->getPermission('user/add')); 
  71.     $auth->addChild($admin$auth->getPermission('user/list')); 
  72.  
  73.     //添加普通员工角色 
  74.     $employee = $auth->createRole('employee'); 
  75.     $employee->description = '普通员工'
  76.     $auth->add($employee); 
  77.     $auth->addChild($employee$auth->getPermission('user/list')); 
  78.     $auth->addChild($employee$auth->getPermission('user/add')); 
  79.   } 
  80.  
  81.   //给用户指派角色 
  82.   public function actionAssign() 
  83.   { 
  84.     $auth = YII::$app->authManager; 
  85.  
  86.     //注意这里的2是用户的ID,即你用户表user里的ID 
  87.     //也可通过YII::$app->user->id获取 
  88.     $auth->assign($auth->getRole('admin'), 1); 
  89.  
  90.     $auth->assign($auth->getRole('employee'), 2); 
  91.   } 
  92.  
  93.   //添加规则 
  94.   public function actionRule() 
  95.   { 
  96.     $auth = YII::$app->authManager; 
  97.     $rule = new UserUpdSelfRule(); 
  98.     $auth->add($rule); 
  99.  
  100.     //创建权限,与规则关联 
  101.     $per = $auth->createPermission('user/upd/updSelf'); 
  102.     $per->description = '用户只能修改自已'
  103.     $per->ruleName = $rule->name; 
  104.     $auth->add($per); 
  105.  
  106.     //这里,要注意,要把user/upd/updSelf权限设为user/upd的父级 
  107.     //要不然,普通员工访问user/upd这个方法会被拦住 
  108.     $auth->addChild($per$auth->getPermission('user/upd')); 
  109.     //给普通员工赋予user/upd/updSelf权限,注意我们这里并没有给员工赋予user/upd权限 
  110.     $auth->addChild($auth->getRole('employee'), $per); 
  111.   } 

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

  1. <?php 
  2.  
  3. //注意命名空间要跟你的目录对应 
  4. namespace app\rbac; 
  5.  
  6. use yii\rbac\Rule; 
  7.  
  8. //必须继承自yii\rbac\Rule 
  9. class UserUpdSelfRule extends Rule 
  10.   public $name = 'userUpdSelf'
  11.  
  12.   //必须要实现execute方法 
  13.   //$user表示用户ID 
  14.   //$item规则相关的角色或者权限 
  15.   //$params传递过来的参数 
  16.   public function execute($user$item$params
  17.   { 
  18.     //如果没有设置参数ID,直接返回true 
  19.     if (!isset($params['id'])) { 
  20.       return true; 
  21.     } 
  22.     //判断id是否是当前用户ID 
  23.     return ($params['id'] == $user) ? true : false; 
  24.   } 

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

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

访问index/role结果如下:

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

访问index/assign结果如下:

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

访问index/rule结果如下:

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

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

BaseController.php代码如下:

  1. <?php 
  2.  
  3. namespace app\controllers; 
  4.  
  5. use YII; 
  6. use yii\web\Controller; 
  7.  
  8. class BaseController extends Controller 
  9.   //不需要验证的 
  10.   protected $noCheckAccess = [ 
  11.     'index/index'
  12.     'index/per'
  13.     'index/role'
  14.     'index/assign'
  15.     'index/rule'
  16.     'index/login'
  17.   ]; 
  18.  
  19.   //不需要登陆的 
  20.   protected $noLogin = [ 
  21.     'index/login'
  22.   ]; 
  23.  
  24.   //验证权限 
  25.   //注意,不要把获取模块名,控制器名,方法名写到init()函数里,那样是获取不到的 
  26.   //这个坑我已经踩了,大家就不用再去踩了 
  27.   public function beforeAction($action
  28.   { 
  29.     $mid = !emptyempty($this->module->id) ? $this->module->id : ''
  30.     $cid = !emptyempty($this->id) ? $this->id : ''
  31.     $aid = !emptyempty($action->id) ? $action->id : ''
  32.  
  33.     //如果模块为basic,我们只验证控制器/方法 
  34.     if ($mid == 'basic') { 
  35.       $per = "{$cid}/{$aid}"
  36.     } else { 
  37.       $per = "{$mid}/{$cid}/{$aid}"
  38.     } 
  39.  
  40.     if (!in_array($per$this->noLogin)) { 
  41.       if (!$this->checkOnline()) { 
  42.         $this->redirect('index/login'); 
  43.       } 
  44.     } 
  45.  
  46.     if (!in_array($per$this->noCheckAccess)) { 
  47.       if (!YII::$app->user->can($per)) { 
  48.         die('你没有权限'); 
  49.       } 
  50.     } 
  51.  
  52.     return parent::beforeAction($action); 
  53.   } 
  54.  
  55.   //检查是否在线 
  56.   public function checkOnline() 
  57.   { 
  58.     return !emptyempty(YII::$app->user->id) ? true : false; 
  59.   } 

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

  1. <?php 
  2.  
  3. namespace app\controllers; 
  4.  
  5. use YII; 
  6. use app\controllers\BaseController; 
  7.  
  8. class UserController extends BaseController 
  9.   public function actionUpd() 
  10.   { 
  11.     $id = YII::$app->request->get('id', 0); 
  12.  
  13.     echo 'user id : ', YII::$app->user->id, '<br>'
  14.  
  15.     //先判断用户有没有只能修改自已的权限 
  16.     if (YII::$app->user->can('user/upd/updSelf')) { 
  17.       //然后再判断修改ID是否与自已的ID一样,在UserUpdSelfRule里进行判断 
  18.       if (YII::$app->user->can('user/upd/updSelf', ['id' => $id])) { 
  19.         echo '有权修改自已'
  20.       } else { 
  21.         echo '不能修改除自已以外的'
  22.       } 
  23.     } else { 
  24.       echo '修改所有'
  25.     } 
  26.   } 
  27.  
  28.   public function actionDel() 
  29.   { 
  30.     echo 'user id : ', YII::$app->user->id, '<br>'
  31.     echo 'user del'
  32.   } 
  33.  
  34.   public function actionList() 
  35.   { 
  36.     echo 'user id : ', YII::$app->user->id, '<br>'
  37.     echo 'user list'
  38.   } 
  39.  
  40.   public function actionAdd() 
  41.   { 
  42.     echo 'user id : ', YII::$app->user->id, '<br>'
  43.     echo 'user add'
  44.   } 

我的用户表里有两个用户

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

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

admin用户状态如下:

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

test用户状态如下:

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

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

Tags: YII2权限控制 RBAC

分享到: