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

我们在项目目录下创建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. { 
  11.   public $name = 'userUpdSelf'; 
  12.  
  13.   //必须要实现execute方法 
  14.   //$user表示用户ID 
  15.   //$item规则相关的角色或者权限 
  16.   //$params传递过来的参数 
  17.   public function execute($user, $item, $params) 
  18.   { 
  19.     //如果没有设置参数ID,直接返回true 
  20.     if (!isset($params['id'])) { 
  21.       return true; 
  22.     } 
  23.     //判断id是否是当前用户ID 
  24.     return ($params['id'] == $user) ? true : false; 
  25.   } 
  26. } 

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

为了演示,我们创建一个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. { 
  10.   public function actionUpd() 
  11.   { 
  12.     $id = YII::$app->request->get('id', 0); 
  13.  
  14.     echo 'user id : ', YII::$app->user->id, '<br>'; 
  15.  
  16.     //先判断用户有没有只能修改自已的权限 
  17.     if (YII::$app->user->can('user/upd/updSelf')) { 
  18.       //然后再判断修改ID是否与自已的ID一样,在UserUpdSelfRule里进行判断 
  19.       if (YII::$app->user->can('user/upd/updSelf', ['id' => $id])) { 
  20.         echo '有权修改自已'; 
  21.       } else { 
  22.         echo '不能修改除自已以外的'; 
  23.       } 
  24.     } else { 
  25.       echo '修改所有'; 
  26.     } 
  27.   } 
  28.  
  29.   public function actionDel() 
  30.   { 
  31.     echo 'user id : ', YII::$app->user->id, '<br>'; 
  32.     echo 'user del'; 
  33.   } 
  34.  
  35.   public function actionList() 
  36.   { 
  37.     echo 'user id : ', YII::$app->user->id, '<br>'; 
  38.     echo 'user list'; 
  39.   } 
  40.  
  41.   public function actionAdd() 
  42.   { 
  43.     echo 'user id : ', YII::$app->user->id, '<br>'; 
  44.     echo 'user add'; 
  45.   } 
  46. } 

我的用户表里有两个用户

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

分享到: