ThinkPHP5 官方不内置 RBAC,需自行实现或使用 gmars/tp5-rbac 等扩展;其认证体系重构,移除 TP3.x 的 RBAC 表配置与方法,转向中间件+自定义验证模式。

ThinkPHP5 官方不内置 RBAC,直接调用 Rbac 类会报错——它压根不存在。你得自己搭结构,或用社区拓展,否则所有“Auth::check()”“Rbac::access()”类写法都是无效的。
为什么 TP5 没有原生 RBAC?
TP5 彻底重构了认证体系,移除了 TP3.x 时代的 RBAC_ROLE_TABLE、saveAccessList 等配置和方法。官方转向更灵活的中间件 + 自定义验证逻辑模式,不再绑定固定表结构和硬编码权限检查流程。
- TP3.x 的
checkAccess()、getAccessList()在 TP5 中完全不可用 -
NOT_AUTH_MODULE这类配置项在 TP5 的config/auth.php或中间件里无对应字段 - 任何教程里直接 new
Rbac()或 usethink\rbac\Rbac的代码,运行即抛出Class 'think\rbac\Rbac' not found
用 gmars/tp5-rbac 拓展快速落地
这是目前最稳定、适配 TP5.1+ 的 RBAC 实现,自动建表、提供门面调用,且不侵入核心流程。
- 执行
composer require gmars/tp5-rbac安装 - 实例化后调用
$rbac->createTable()—— 它会生成permission、role、user_role等 6 张表(注意:不是 TP3 风格的think_node) - 权限判断用
Rbac::check($userId, $path),其中$path是字符串,如'admin/user/edit',对应数据库permission.path字段 - 别用
$rbac->check()实例方法,它不缓存结果;优先用门面Rbac::check(),内部已做 session 缓存优化
手写轻量 RBAC 的关键三步
不想引入拓展?可以只用 3 张表 + 1 个中间件搞定最小可用 RBAC,适合中小后台。
立即学习“PHP免费学习笔记(深入)”;
- 表结构只要
users(含role_id)、roles(含permissionsJSON 字段)、permissions(纯字典,可选)——避免多对多关联查询拖慢首页 - 在中间件里获取
request()->controller()和request()->action(),拼成$node = strtolower($module.'/'.$controller.'/'.$action)(TP5 默认无模块层,通常为admin/user/edit) - 查库逻辑:先查用户角色,再查该角色的
permissions字段(JSON),用in_array($node, json_decode($role['permissions'], true))判断——简单直接,调试时 dump 一眼就明白权限来源 - 超级管理员走白名单绕过:
if ($user['issuper']) return true;,别在 SQL 里反复 join 权限表
最容易被忽略的路径匹配细节
权限节点字符串必须和路由解析结果严格一致,差一个斜杠、大小写、前后缀都会失效。
- TP5 默认路由是
admin/user/edit,不是Admin/User/Edit或/admin/user/edit(开头斜杠不要) - 如果你启用了
url_convert(默认开启),控制器名UserGroup会被转成user_group,对应节点就得写admin/user_group/index - 资源路由(
Route::resource('user', 'User'))会生成user/index、user/create等动作,但不会自动注册user/read——你要手动把完整动作列表写进权限表 - 中间件中建议用
think\Request::instance()->pathinfo()做兜底比对,防止路由分组导致controller()取值不准



















