YII2框架中使用RBAC对模块,控制器,方法的权限控(2)
我们在项目目录下创建rbac目录,并创建UserUpdSelfRule.php,来实现用户只能修改自已信息的规则。
<?php //注意命名空间要跟你的目录对应 namespace app\rbac; use yii\rbac\Rule; //必须继承自yii\rbac\Rule class UserUpdSelfRule extends Rule { public $name = 'userUpdSelf'; //必须要实现execute方法 //$user表示用户ID //$item规则相关的角色或者权限 //$params传递过来的参数 public function execute($user, $item, $params) { //如果没有设置参数ID,直接返回true if (!isset($params['id'])) { return true; } //判断id是否是当前用户ID return ($params['id'] == $user) ? true : false; } }
我们访问index/per查看数据表中的变化。
访问index/role结果如下:
访问index/assign结果如下:
访问index/rule结果如下:
为了能够对我们的模块,控制器,方法进行权限控制,我们需要创建一个基类来统一处理,上面的控制器就是继承自基类。
BaseController.php代码如下:
<?php namespace app\controllers; use YII; use yii\web\Controller; class BaseController 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}"; } 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,代码如下: