必须启用并正确配置rbac系统,包括:一、用dbmanager建表;二、代码初始化角色权限;三、phpmanager文件存储;四、accesscontrol路由过滤;五、rule类动态校验。

如果您在 Yii2 应用中需要对用户操作进行细粒度访问控制,则必须启用并正确配置基于角色的访问控制(RBAC)系统。以下是多种可独立实施的 RBAC 权限控制实现方法:
一、配置 DbManager 并初始化数据库表
Yii2 的 RBAC 默认不自带数据库结构,必须通过迁移命令创建四张核心表(auth_item、auth_item_child、auth_assignment、auth_rule),否则所有权限操作将因表缺失而失败。
1、确认 console/config/main.php 中已注册 migrate controllerMap,包含如下配置:
2、确保数据库连接正常,且 config/console.php 或 config/main.php 中 'authManager' 组件已启用 DbManager:
'authManager' => ['class' => 'yii\rbac\DbManager']
3、在项目根目录执行迁移命令:
yii migrate --migrationPath=@yii/rbac/migrations
4、若使用非默认数据库组件(如名为 mainDb),需追加参数:
yii migrate --migrationPath=@yii/rbac/migrations --db=mainDb
5、迁移完成后,手动检查数据库是否生成 auth_item、auth_item_child、auth_assignment、auth_rule 四张表。
二、通过代码初始化角色与权限关系
该方法适用于开发阶段或需程序化预置权限体系的场景,避免依赖外部脚本,所有定义均在 PHP 代码中完成,便于版本控制和环境一致性保障。
1、新建控制器 RbacController(如置于 console/controllers/RbacController.php):
2、在 actionInit 方法中获取 authManager 实例:
$auth = Yii::$app->authManager;
3、创建权限项(如 createPost、updatePost)并设置描述:
$createPost = $auth->createPermission('createPost'); $createPost->description = '允许用户创建文章'; $auth->add($createPost);
4、创建角色(如 author、editor、admin):
$author = $auth->createRole('author'); $auth->add($author);
5、建立角色与权限的父子关系(如 author 可创建文章):
$auth->addChild($author, $createPost);
6、建立角色继承关系(如 editor 继承 author):
$auth->addChild($editor, $author);
7、将角色分配给指定用户 ID(如用户 ID 为 1):
$auth->assign($author, 1);
三、使用 PhpManager 实现文件存储型 RBAC
该方案将权限数据序列化保存至本地 PHP 文件,无需数据库依赖,适合小型项目、单机部署或快速原型验证,但不支持多服务器集群下的实时同步。
1、修改 config/web.php 或 config/main.php 的 components 配置:
'authManager' => ['class' => 'yii\rbac\PhpManager']
2、确保 runtime 目录具备写入权限,PhpManager 将在其中生成 auth.php 文件。
3、在任意可执行上下文中(如控制器 action)调用初始化逻辑:
$auth = Yii::$app->authManager; $auth->init();
4、创建权限与角色后,必须显式调用 save() 持久化到文件:
$auth->save();
5、后续权限校验仍统一使用 Yii::$app->user->can('createPost),其行为与 DbManager 完全一致。
四、结合 AccessControl 实现静态路由级权限过滤
此方法在控制器层拦截请求,依据用户角色直接拒绝未授权访问,适用于固定动作集合(如 CRUD 操作),不涉及动态参数校验,性能开销最低。
1、在控制器类中重写 behaviors() 方法:
2、配置 access 规则,明确指定允许访问的动作与对应角色:
['actions' => ['create', 'update'], 'allow' => true, 'roles' => ['editor']]
3、添加访客白名单规则(如登录页、错误页):
['actions' => ['login', 'error'], 'allow' => true]
4、启用 '@' 表示已认证用户,'?' 表示游客,角色名(如 'admin')须与 RBAC 中定义完全一致。
5、确保控制器继承 yii\web\Controller 或其子类,且用户身份已由 User 组件正确识别。
五、编写 Rule 类实现动态条件权限控制
Rule 允许在权限判断时注入运行时逻辑,例如限制用户仅能操作本人创建的数据,或根据时间、状态等上下文变量动态放行/拦截。
1、新建自定义 Rule 类(如 common/rbac/OwnPostRule.php):
2、继承 yii\rbac\Rule 并重写 execute() 方法:
public function execute($user, $item, $params) { return isset($params['post']) && $params['post']->created_by == $user; }
3、在权限初始化阶段注册该 Rule:
$rule = new OwnPostRule(); $auth->add($rule);
4、创建带 Rule 关联的权限项:
$updateOwnPost = $auth->createPermission('updateOwnPost'); $updateOwnPost->ruleName = $rule->name; $auth->add($updateOwnPost);
5、校验时传入必要参数:
Yii::$app->user->can('updateOwnPost', ['post' => $post]);











