今天我给大家带来一种 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;
}
如上所示 -----/
我们大家放到自己喜欢的位置 ,前提 是 公用 方便
数据库操作的也一样 大家大胆去尝试。会成功的,加油!
谢谢大家的细心观看,如果有错误,请提出,及时改正,谢谢!!