Yii2 RBAC权限系统需三步落地:一建底座(DbManager+四张表),二理关系(按resource:action定义权限并构建继承链),三守边界(后端AccessControl拦截+前端隐藏双保险)。

Yii2 的 RBAC 权限系统不是“装个插件就能用”,而是要理解它怎么工作、在哪卡住、哪些环节漏了就直接失效。从零开始设计并落地,关键在三步:建好底座(数据库+组件)、理清关系(用户-角色-权限的绑定逻辑)、守住边界(前端藏菜单 ≠ 后端放行)。下面按实战顺序讲清楚。
一、先搭好 RBAC 底座:DbManager + 四张表
Yii2 的 RBAC 默认不带任何数据表,必须手动初始化。光配组件不建表,所有 addRole、assign 操作都会静默失败。
- 确认 console/config/main.php 中已注册 migrate 命令(尤其高级模板需检查 console 配置)
- 在项目根目录执行:
yii migrate --migrationPath=@yii/rbac/migrations - 检查数据库是否生成四张核心表:
auth_item(存角色/权限)、auth_item_child(存父子关系,如 editor → author)、auth_assignment(用户 ID ↔ 角色名)、auth_rule(可选,用于动态规则,如“只能改自己发布的文章”) - 若用非默认数据库连接(比如叫
mainDb),迁移时加参数:yii migrate --migrationPath=@yii/rbac/migrations --db=mainDb
二、定义权限结构:资源+动作拆分,避免硬编码字符串
别写 'canEditOrder' 这种模糊名,应按 resource:action 格式定义,比如 'order:update'、'user:delete'。这样后期做按钮级控制、API 拦截、甚至导出权限清单都更清晰。
- 在控制台控制器(如
console/controllers/RbacController.php)中编写actionInit() - 先创建权限项(Permission),再建角色(Role),最后用
addChild()组织继承链:
→author拥有post:create
→editor继承author,并额外拥有post:update
→admin继承editor,并拥有user:manage - 分配角色给用户时,用真实用户 ID:
$auth->assign($author, 1); // 用户ID为1
三、后端拦截必须生效:AccessControl + allowActions 精确放行
只靠前端隐藏菜单或按钮是危险的。URL 直接访问、Postman 调用接口,必须被拦在门外。
- 在 config/web.php 的
as access配置中,明确列出允许免鉴权的路径:'allowActions' => ['site/login', 'site/error', 'api/v1/public/*']
生产环境切忌写'*'或'admin/*' - 确保
authManager组件已启用且类为yii\rbac\DbManager,否则所有Yii::$app->user->can()判断都返回 false - 在控制器方法里,用
Yii::$app->user->can('order:export')做细粒度判断,而不是只校验角色名
四、配套管理界面:用 yii2-admin 快速上线可视化后台
手写 CRUD 页面成本高,官方推荐的 mdmsoft/yii2-admin 模块能直接补全角色、权限、分配三大界面。
- 安装:
composer require mdmsoft/yii2-admin "~2.0" - 配置模块与组件(同上 DbManager),并添加
as access行为 - 运行第二轮迁移:
yii migrate --migrationPath=@mdm/admin/migrations
这会建 menu、admin_user 等扩展表,支持路由自动发现和菜单管理 - 访问
/admin即可管理角色、分配权限、查看用户挂载情况——但注意:它不替代后端校验,只是配置入口


















