Yii2 的 RBAC(Role-Based Access Control 基于角色的访问控制)
又再写,又需要温故而知新。今天主要关注它再数据库中创建的4张表
Yii2 的 RBAC(Role-Based Access Control,基于角色的访问控制)使用 DbManager(数据库方式)时,主要依赖 4 张表 来存储所有权限相关数据。
理解一个关键点:角色与权限都存放在 auth_item 这张表中,通过 type 字段区分
auth_item 表 权限、角色 ,同时存放 角色 和 权限 的基本信息 。 主要字段:
name : 可以是 post.add post.delete 或 admin user
type : 2 是权限 1 是角色
description: 这个描述 一定要有 不然时间长了 不知到这个是干什么的权限
所以创建这个表可以先插入角色数据,后插入权限数据。
auth_item_child 表 继承、包含关系表。 记录“谁包含谁” 角色包含权限、角色包含子角色
还是直接上个表数据举例说明 用于定义层次结构
parent child 表中就这2个字段 user admin.view user admin.add user admin.delete #以上是用户user 的几个可用权限 admin user #这是admin 包含 user 也就等于admin也拥有了user的3个权限,或者说是admin继承了user admin admin.recycle admin admin.restore admin admin.purge #这三行是 给 admin角色添加了3个新的权限
auth_assignment 角色 分配/指派表 记录“哪个用户拥有哪个角色”
主要两个字段
item_name 对应 auth_item 中的name (一般是type=1的角色)
user_id 用户id
所以这个表只有在添加或注册用户的时候,根据用户的情况 是分配给什么角色。
auth_rule 定义业务规则 。用于定义更复杂的业务规则,即逻辑权限控制。
示例:用户只能编辑自己的文章
class AuthorRule extends \yii\rbac\Rule
{
public $name = 'isAuthor';
public function execute($user, $item, $params)
{
return isset($params['post']) ? $params['post']->created_by == $user : false;
}
}写入 auth_rule 表中的数据则是
namedataisAuthor序列化后的 rule 数据这个后面了 再补充
贴个示例代码
<?php
namespace console\controllers;
use Yii;
use yii\console\Controller;
use yii\console\ExitCode;
use backend\models\AdminUser;
class AdminController extends Controller
{
// 添加一个超级用户
public function actionInit()
{
$admin = new AdminUser();
$admin->username = 'admin';
$admin->email = 'sino_cl@163.com';
$admin->nickname = '超级管理员';
$admin->setPassword('12345678'); // 或更安全的密码
$admin->generateAuthKey();
$admin->generatePasswordResetToken(); // 可选
$admin->status = 10;
$admin->save(false);
$this->actionRbac();
$this->setAdminAssign(1);
}
public function setAdminAssign($userid = 2)
{
// ── 这里开始分配角色 ──
$auth = Yii::$app->authManager;
// 方式A:分配单个固定角色(推荐新手用这个)
if($userid == 1){
$role = $auth->getRole('admin'); // 改成你实际创建的角色名
// $role = $auth->getRole('author');
// $role = $auth->getRole('member');
$auth->assign($role, 1); // 注意:第二个参数是用户ID(整数)
}
if($userid >= 2){
$role = $auth->getRole('user');
if ($role) {
$auth->assign($role, $userid);
}
}
}
/**
* 初始化 后台RBAC
* 用法:php yii admin/rbac
* 注意: 在执行这个之前需要先 做 数据迁移 php yii migrate --migrationPath=@yii/rbac/migrations
*/
public function actionRbac()
{
// 在控制器中 配置 权限管理器
/**
Yii::$app->set('authManager', [
'class' => 'yii\rbac\DbManager',
]);
**/
$auth = Yii::$app->authManager;
// 清空旧数据(谨慎使用,开发期推荐)
$auth->removeAll();
// ---------- 后台用户管理权限 ----------
$adminView = $auth->createPermission('admin.view');
$adminView->description = '查看用户';
$auth->add($adminView);
$adminAdd = $auth->createPermission('admin.add');
$adminAdd->description = '添加用户';
$auth->add($adminAdd);
$adminDelete = $auth->createPermission('admin.delete');
$adminDelete->description = '删除用户到回收站';
$auth->add($adminDelete);
$adminRecycle = $auth->createPermission('admin.recycle');
$adminRecycle->description = '用户回收站';
$auth->add($adminRecycle);
$adminRestore = $auth->createPermission('admin.restore');
$adminRestore->description = '恢复用户';
$auth->add($adminRestore);
$adminPurge = $auth->createPermission('admin.purge');
$adminPurge->description = '彻底删除用户';
$auth->add($adminPurge);
// ---------- 角色 ----------
$user = $auth->createRole('user');
$user->description = '普通管理用户';
$auth->add($user);
$admin = $auth->createRole('admin');
$admin->description = '超级管理员';
$auth->add($admin);
// ---------- 权限分配 ----------
// user
$auth->addChild($user, $adminView);
$auth->addChild($user, $adminAdd);
$auth->addChild($user, $adminDelete);
// admin 自动继承 user 并添加新权限
$auth->addChild($admin, $user);
$auth->addChild($admin, $adminRecycle);
$auth->addChild($admin, $adminRestore);
$auth->addChild($admin, $adminPurge);
// ---------- 绑定管理员 ----------
// ⚠️ 把 1 改成你自己的管理员用户 ID 添加用户
// $auth->assign($admin, 1);
// $auth->assign($user, 2);
// 这里注释掉 是 让用户注册或初始化的时候 依据用户情况分配角色
$this->stdout("后台 RBAC 初始化完成\n");
}
}
登录后可以发表评论与回复。
还没有评论,来做第一个发言的人。