我们在项目目录下创建rbac目录,并创建UserUpdSelfRule.php,来实现用户只能修改自已信息的规则。
<?php
//注意命名空间要跟你的目录对应
namespace apprbac;
use yiirbacRule;
//必须继承自yiirbacRule
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 appcontrollers;
use YII;
use yiiwebController;
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,代码如下:
<?php
namespace appcontrollers;
use YII;
use appcontrollersBaseController;
class UserController extends BaseController
{
public function actionUpd()
{
$id = YII::$app->request->get('id', 0);
echo 'user id : ', YII::$app->user->id, '<br>';
//先判断用户有没有只能修改自已的权限
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, '<br>';
echo 'user del';
}
public function actionList()
{
echo 'user id : ', YII::$app->user->id, '<br>';
echo 'user list';
}
public function actionAdd()
{
echo 'user id : ', YII::$app->user->id, '<br>';
echo 'user add';
}
}







