角色继承不生效是因为未正确调用addChild()、角色status≠1、未刷新缓存或用户ID类型错误。必须用Role对象而非字符串调用addChild(),设role->status=1,每次修改后执行invalidateCache(),且assign时传入int型userId并确保getId()返回int。

角色继承不生效,不是配置漏了,而是几个关键动作没做对。Yii2 的 RBAC 不自动推导关系,所有继承链都得手动建立、显式启用、缓存刷新。
确认 addChild() 是否已正确调用
父角色和子角色之间必须调用 $auth->addChild($parent, $child),且两个参数必须是已通过 addRole() 存入系统的 Role 对象(不能传字符串名)。常见错误:
- 写了
$auth->addRole('admin')和$auth->addRole('editor'),但没调addChild() - 误写成
$auth->addChild('admin', 'editor')—— 字符串会报 Unknown Role: editor - 顺序反了,比如
$auth->addChild($editor, $admin),导致 editor 反而继承 admin,逻辑颠倒
检查角色 status 是否为 1
通过 createRole() 创建的角色默认 status = 0(禁用状态),不会参与权限计算。必须显式设为启用:
- 创建后立即设置:
$admin->status = 1; $auth->add($admin); - 或建好后再更新:
$auth->update('admin', $admin);(需先查出对象再改) - 数据库中可直接查
auth_item表的status字段验证
验证缓存是否已清除
权限判断走缓存,任何增删改操作后不刷新,can() 就永远读旧数据:
- 每次调用
addRole()、addChild()、assign()后,必须加一行:Yii::$app->authManager->invalidateCache(); - 若用了 Redis 或 APCu,确认
'cache' => 'cache'配置指向的是真实缓存组件 - 临时排查可设
'cache' => null关闭缓存再试
核对用户 ID 类型与分配逻辑
权限继承最终要落到用户头上,这里有两个硬性要求:
-
$userId必须是整数(int),传字符串如'123'会导致auth_assignment.user_id写入为 0 - User 模型中的
getId()方法必须返回int,不能是字符串、NULL 或其他类型 - 确保已执行
$auth->assign($role, $userId),且该用户确实被赋予了父角色(不是只赋了子角色)


















