必须先配置DbManager并生成四张RBAC表,再初始化角色体系,否则权限操作静默失败;需执行迁移、检查表结构、代码创建角色并分配,最后用can()验证。

要在 Yii2.0.48 中启用角色控制功能,必须先完成 RBAC 系统的底层配置,否则所有 assign、can、addChild 等操作都会因组件未就绪或数据表缺失而静默失败,连错误提示都不会抛出——你只会看到用户始终无权限,菜单不显示,路由被拦截。
启用 DbManager 并生成四张核心表
Yii2.0.48 默认不启用任何 authManager,必须显式配置 DbManager 并手动建表,PhpManager 无法支撑生产环境的角色继承与动态分配需求。
第一步:打开 console/config/main.php,在 components 数组中加入以下配置:
'authManager' => ['class' => 'yii\rbac\DbManager']
第二步:确保数据库连接已正确配置(检查 common/config/main-local.php 或 console/config/main.php 中的 db 组件),且该数据库可写。
第三步:在项目根目录执行迁移命令:yii migrate --migrationPath=@yii/rbac/migrations
第四步:迁移完成后,立即检查数据库是否生成 auth_item、auth_item_child、auth_assignment、auth_rule 四张表。缺少任意一张,后续所有权限操作均无效——尤其是 auth_assignment 表缺失时,assign() 调用看似成功,实则数据根本没落库。
通过代码初始化角色体系
适用于开发环境快速预置 author/admin/editor 三类角色,所有定义集中管控,避免手工在后台界面反复点击出错。
方法一:创建 console/controllers/RbacController.php
方法二:在 actionInit() 中依次执行以下操作:
① 获取 authManager 实例:
$auth = Yii::$app->authManager;
② 创建角色并入库:
$admin = $auth->createRole('admin');
$auth->add($admin);
注意:createRole() 只构造对象,必须调用 add() 才写入 auth_item 表,否则 addChild 或 assign 会报 Unknown Role 错误。
③ 创建子角色并建立继承:
$editor = $auth->createRole('editor');
$auth->add($editor);
$auth->addChild($admin, $editor);
这一步表示 admin 角色自动拥有 editor 的全部权限,但 不能反过来写 $auth->addChild($editor, $admin),否则形成无效反向依赖。
④ 分配角色给用户 ID:
$auth->assign($admin, 1);
此处用户 ID 必须是真实存在的整数主键,若用户表用 UUID 或字符串 ID,则需先转换或改用其他分配方式。
验证角色是否生效
不要依赖后台界面刷新或页面跳转来判断,直接用 PHP 代码验证最可靠。
在任意控制器 action 中插入测试代码:
Yii::$app->user->isGuest || var_dump(Yii::$app->user->can('updatePost'));
若返回 false,先检查 auth_assignment 表中 user_id=1 是否有对应记录;再检查 auth_item_child 表里 admin → editor 关系是否存在;最后确认当前请求生命周期内未缓存旧权限图谱——开发阶段建议临时设 'cache' => null,避免 DbManager 缓存干扰判断。


















