今天我给大家带来一种 yii 框架 自带 rbac的基础操作 如果写的不好请及时提出,一起解决,谢谢!!
yii 框架 rbac 基础操作
第一步 : 先建表
DbManager
1.yii config文件配置(我用的高级模板)(配置在common/config/main-local.php或者main.php)
'authManager' => [
'class' => 'yii\rbac\DbManager',
'itemTable' => 'auth_item',
'assignmentTable' => 'auth_assignment',
'itemChildTable' => 'auth_item_child',
],
2.当然,在配置里面也可以设置
默认角色,只是我没写。Rbac 支持两种类,PhpManager 和 DbManager ,这里我先 DbManager 。
运行的时候 , 记住在 yii 框架根目录,用 cmd 操作
yii migrate(运行这个命令,生成user表)
yii migrate --migrationPath=@yii/rbac/migrations/
也可以 在 我们 的 yii框架里找到 它是如何 运行的
大家请看:

上面的图 明显的 说明了,yii 框架 里 有他已经设计好的 sql 我们去运行就好了,很方便,很好
安装表后我们来简单的去测试下:
我们 可以 用DbManager
这个的意思就是 操作数据库 进行 实现rbac'
也可以
使用PhpManager ,其意思是自动创建缓存文件,提供我们 来使用
我先来说
PhpManager 操作
第一步
也就是上面的第一步在 config 里配置 操作为
DbManager
第二步
在我们的后台里 新建 一个rbac 一会里面会自动生成 一两个文件
如图所示

来说以下我们的控制器
先简单的创几个:
<?php
namespace backend\controllers;
use yii\web\Controller;
class PostController extends Controller
{
public function actionAdd()
{
return $this->renderContent('添加');
}
public function actionDelete()
{
return $this->renderContent('删除');
}
public function actionUpdate()
{
return $this->renderContent('更新');
}
public function actionSelect()
{
return $this->renderContent('查询');
}
}
在创建一个rbac 控制器 进行 添加 角色 等等 操作
authManager授权管理(动态的授权管理)
动态管理权限, 其实就是将用权限分配和校验, 都是使用PHP代码完成, 在程序运行时完成, 需要的方法如下
$auth = \Yii::$app->authMananger;
$auth->createPermission(), 创建权限对象
$auth->createRole(), 创建角色对象
$auth->add(), 添加角色或者权限或者规则
$auth->addChild(), 为角色赋予权限, 添加子权限
$auth->assign(), 为用户分配角色
$auth->remove(), 删除某个授权数据
$auth->removeAll(), 删除全部授权数据包括, 角色, 权限, 规则
\Yii::$app->user->can(‘权限’))检测用户是否具有某权限
// 增加的用于测试权限管理方法的动作, 放在控制器中请求执行即可
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);
}
|
以上代码一旦运行, 就会生成权限文件和权限分配文件如下:
权限文件:items.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | items.php权限列表文件 <?php return [ 'postAdd' => [ 'type' => 2, 'description' => '文章添加', ], 'postDelete' => [ 'type' => 2, 'description' => '文章删除', ], 'postUpdate' => [ 'type' => 2, 'description' => '文章编辑', ], 'postSelect' => [ 'type' => 2, 'description' => '文章查看', ], 'author' => [ 'type' => 1, 'children' => [ 'postAdd', 'postUpdate', ], ], 'reader' => [ 'type' => 1, 'children' => [ 'postSelect', ], ], 'editor' => [ 'type' => 1, 'children' => [ 'postDelete', 'postSelect', 'author', 'reader', ], ], ]; |
角色分配文件:assignments.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
assignments.php角色分配文件
<?php
return [
2 => [
'author',
'reader',
],
3 => [
'reader',
],
4 => [
'reader',
],
5 => [
'editor',
],
];
|
大家可以看到, 这个角色分配文件, 与我们之前的一致.
在此基础上, 增加了权限记录文件items.php 这个文件记录下来了那个角色有哪些权限, 这样就不需要再使用ACF进行权限与动作的对应了.
注意, 在yii的RBAC系统中, 可以将角色视为权限的集合, 因此 才会有代码:
| $auth->addChild($author, $postAdd);// 作者 添加文章 $auth->addChild($author, $postUpdate);// 作者 编辑文章 $auth->addChild($reader, $postSelect);// 读者 看文章 $auth->addChild($editor, $postDelete); $auth->addChild($editor, $postSelect); $auth->addChild($editor, $author); // 添加author角色权限为editor权限的子权限 $auth->addChild($editor, $reader); |
将权限设置为角色的子对象, 和将角色设置为角色的自对象. 可以理解成权限的集合, 和集合的合并(继承)操作.
有了以上的代码, 就有能力去动态的设置角色的权限了. 可以在后台增加一个权限管理界面, 完成角色的权限分配了.
权限的校验(动态校验)
当使用了动态授权管理后, 通常就不去使用ACF管理权限了.
就可以使用user组件提供的can()方法来检测当前用户是否具有某个权限了. 在某个具体的动作中, 使用方法: $user->can(‘postAdd’) 就可以知道是否具有操作postAdd的权限, 示例代码如下:
|
public function actionAdd()
{
$user = \Yii::$app->user;
if (! $user->can('postAdd')) {
return $this->renderContent('没有权限执行该操作');
}
return $this->renderContent('添加');
}
|
每一个方法里都要写判断是不是很麻烦
我给大家
封装一下
公共的:
public function beforeAction ($action){
$user = \Yii::$app->user;
$name=ucfirst($action->id);
if (! $user->can($name)) {
echo $this->renderContent('没有权限执行该操作');die;
}
return true;
}
如上所示
-----/
我们大家放到自己喜欢的位置 ,前提 是 公用 方便
数据库操作的也一样
大家大胆去尝试。会成功的,加油!
谢谢大家的细心观看,如果有错误,请提出,及时改正,谢谢!!