各位猿友,今天来点干货
我们在使用yii框架中自带的rbac时,需要先知道rbac的原理:
用户->角色->权限 以及 用户和角色之间的关系,角色和权限之间的关系。
配置授权管理组件
1.yii config 文件配置(我用的是高级版本)(配置在common/config/main.php 或者main-local.php)
return [
'components' => [
'authManager' => [
'class' => 'yii\rbac\PhpManager',
],
该授权组件, 可选择由PHP文件存储授权数据或使用数据库存储授权数据. 分别使用yii\rbac\PhpManager和yii\rbac\DbManager实现. 文件存储直观, 编辑简单, 但不适合频繁大量的授权更新操作. 而数据库管理方案适合频繁的授权变动. 请依据自己项目的情况自行选择. 以上的配置中, 选择的PhpManager, 以PHP文件方式存储授权, 此时需要@app/rbac目录(backend/rbac)存在, 并具有可写权限. 如果需要使用数据库管理授权数据, 请看后边的DbManager授权管理小节.
配置完毕后, 使用\Yii::$app->authManager就可以访问到授权组件了
在数据库中创建表
2.Rbac 支持两种类,PhpManager 和 DbManager ,这里我使用PhpManager 。
yii migrate(运行这个命令,生成user表)
生成一个rbac权限
// 增加的用于测试权限管理方法的动作, 放在控制器中请求执行即可
public function actionAuth()
{
$auth = \Yii::$app->authManager;
// 删除全部
$auth->removeAll();
// 增加权限
$postAdd = $auth->createPermission('postAdd');
$postAdd->description = '文章添加';
$auth->add($postAdd);
$postDelete = $auth->createPermission('postDelete');
$postDelete->description = '文章删除';
$auth->add($postDelete);
$postUpdate = $auth->createPermission('postUpdate');
$postUpdate->description = '文章编辑';
$auth->add($postUpdate);
$postSelect = $auth->createPermission('postSelect');
$postSelect->description = '文章查看';
$auth->add($postSelect);
// 增加角色
$author = $auth->createRole('author');
$auth->add($author);
$reader = $auth->createRole('reader');
$auth->add($reader);
$editor = $auth->createRole('editor');
$auth->add($editor);
// 为角色赋予权限
$auth->addChild($author, $postAdd);//
作者 添加文章
$auth->addChild($author, $postUpdate);//
作者 编辑文章
$auth->addChild($reader, $postSelect);//
读者 看文章
$auth->addChild($editor, $postDelete);
$auth->addChild($editor, $postSelect);
$auth->addChild($editor, $author);
$auth->addChild($editor, $reader);
// 为用户分配角色
$auth->assign($author, 2);
$auth->assign($reader, 2);
$auth->assign($reader, 3);
$auth->assign($reader, 4);
$auth->assign($editor, 5);
}
在任意控制器中运行以上代码 会在rbac文件夹中自动生成关系表。
我们在yii框架自带的表单页面中注册账号并登陆 此时会根据用户ID给相应的用户分配角色及权限。
下面我们需要再次创建一个控制器来验证相应的用户是否拥有正确的角色及权限
权限的校验(动态校验)
public function actionAdd()
{
$user = \Yii::$app->user;
if (! $user->can('postAdd')) {
return $this->renderContent('没有权限执行该操作');
}
return $this->renderContent('添加');
}
到此 我们就完成了通过文件的形式实现rbac
下次 给大家介绍如何通过数据库建表的形式来实现RBAC