Yii 2 授权(RBAC)
授权是指验证用户是否允许做某件事的过程。Yii提供了基于角色的存取控制(RBAC)
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。(如下图)
基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。
2.1 配置Yii RBAC
这里我使用的是Yii 的基础模板 ,要配置2 个地方 1.在 config/console.php ,2在config/web.php
console.php和web.php web.php 中不配会报错 :
'authManager'=>[
'class'=>\yii\rbac\DbManager::class,
]
传统的是5张表 ,但 yii 进行了改变只有4 张表
要想使用数据库来完成RBAC需要四个数据表
yii\rbac\DbManager::$itemTable: 该表存放授权条目(即角色表和权限表)。默认表名为 “auth_item” 。
yii\rbac\DbManager::$itemChildTable: 该表存放授权条目的层次关系(角色和权限关系表)。默认表名为 “auth_item_child”。
yii\rbac\DbManager::$assignmentTable: 该表存放授权条目对用户的指派情况(用户和角色关系表)。默认表名为 “auth_assignment”。
yii\rbac\DbManager::$ruleTable: 该表存放规则。默认表名为 “auth_rule”
还有一张admin 表 可以在我的Yii 认证 这篇博客中找到
使用数据迁移:
yii migrate --migrationPath=@yii/rbac/migrations
使用这几个路由来分配 权限:
//测试权限
public function actionAddArticle()
{
echo 'add-article';
}
public function actionViewArticle()
{
echo 'view-article';
}
public function actionDelArticle()
{
echo 'del-article';
}
接下来将分配权限和角色
//用户权限
/**
* @throws \yii\base\Exception
* @throws \Exception
*/
public function actionRbac()
{
$authManager = \Yii::$app->authManager;
//两个用户admin zhangsan
//1添加两个角色 超级管理员 普通员工
//1.1 创建角色
$adminRole = $authManager->createRole('超级管理员');
$memberRole = $authManager->createRole('普通员工');
//1.2 保存到数据表
$authManager->add($adminRole);
$authManager->add($memberRole);
//2三个权限 admin/add-article admin/view-article admin/del-article
//2.1 创建权限
$addPermission = $authManager->createPermission('admin/add-article');
$viewPermission = $authManager->createPermission('admin/view-article');
$delPermission = $authManager->createPermission('admin/del-article');
//2.2 保存到数据表
$authManager->add($addPermission);
$authManager->add($viewPermission);
$authManager->add($delPermission);
//用户和角色关联 admin-超级管理员 zhangsan-普通员工
$authManager->assign($adminRole,4);
$authManager->assign($memberRole,3);
//角色和权限关联 超级管理员[admin/add-article admin/view-article admin/del-article]
$authManager->addChild($adminRole,$addPermission);
$authManager->addChild($adminRole,$viewPermission);
$authManager->addChild($adminRole,$delPermission);
// 普通员工[admin/view-article]
$authManager->addChild($memberRole,$viewPermission);
echo "分配成功";
}
以上配置完成后就分配好这些关系了
但具体的实现要靠我们自己来写 使用过滤器:
<?php
namespace app\filters;
use yii\base\ActionFilter;
use yii\web\HttpException;
class RbacFilter extends ActionFilter {
//动作执行前
public function beforeAction($action)
{
//判断当前用户是否拥有该路由(权限)操作权限
$allow=\Yii::$app->user->can($action->uniqueId);
if ($allow==false) {
//判断当前用户是否登录?如果没有登录则跳转到登录页面
if (\Yii::$app->user->isGuest){
return $action->controller->redirect(\Yii::$app->user->loginUrl);
}
throw new HttpException(403,"对不起没有权限");
}
return parent::beforeAction($action); // TODO: Change the autogenerated stub
}
}
再到控制器进行行为分配:
public function behaviors()
{
return[
'rbac'=>[
'class'=>RbacFilter::class,
'only'=>['add-article','del-article','view-article'],
]
];
// return parent::behaviors(); // TODO: Change the autogenerated stub
}
以上就完成了授权的简单编写。