rbac数据表设计应避免权限字段冗余,仅auth_rule的name和type用于权限判定,其余字段放缓存;condition慎用以防sql注入;角色用户关系必须走auth_group_access;pid须为int且允许0;登录后立即auth::setuser($uid)。

RBAC 数据表设计要避开「权限字段冗余」陷阱
ThinkPHP 自带的 AuthRule、AuthGroup、AuthGroupAccess 三张表够用,但很多人一上来就加 status、sort、remark 到每张表里,结果后期查权限时 JOIN 越来越慢。核心原则是:权限判定只依赖 auth_rule 的 name(如 admin/user/index)和 type(1=菜单,2=操作),其余字段全放缓存里。
实操建议:
-
auth_rule表中condition字段慎用——它会在每次鉴权时拼 SQL 执行,极易引发 SQL 注入或全表扫描,除非你真需要动态条件(比如「仅允许编辑自己创建的内容」),否则留空 - 角色和用户关系必须走
auth_group_access,别用中间表自定义字段(如加start_time),TP 的Auth类不识别这些字段,白加 - 菜单节点的
pid必须为 int 类型且允许为 0,否则getMenuList()递归出错,常见错误是把pid设成 varchar 导致无限循环
中间件里调用 Auth::check() 前必须重置用户 session
很多人在中间件里直接 Auth::check('admin/article/edit', $uid),发现总返回 false。根本原因是 TP6 的 Auth 类默认从 session('think_auth') 读权限缓存,而后台登录后没主动写入——它只在 Auth::setUser($uid) 后才生成缓存。
实操建议:
- 登录成功后立刻调用
Auth::setUser($uid),不要等跳转后再做 - 中间件中别用
$request->param('id')拼权限名,应统一用路由规则名(如admin.article.delete),避免 URL 参数变动导致权限失效 - 若用多应用模式(如
admin和api分开),需在中间件里传入app参数:Auth::check('article/delete', $uid, 'admin'),否则默认查app应用下的规则
AuthRule 的 name 字段必须与路由定义完全一致
权限名不是随便写的字符串,它必须严格匹配路由绑定的完整操作标识。比如你在 route/app.php 里写了 Route::get('admin/user/list', 'admin.UserController@list');,那对应权限名只能是 admin/user/list(斜杠分隔),不能是 admin.user.list 或 user_list。
常见错误现象:
- 页面能打开但按钮无权限——因为按钮权限名写成
user:edit,而路由实际是admin/user/edit - 删除接口 403 却日志没报错——
Auth::check()返回 false,但中间件没 throw 异常,只是静默跳转到 403 页面 - 使用资源路由时,
Route::resource('article', 'ArticleController')会自动注册 7 个动作,对应权限名分别是article/index、article/create、article/save等,不是article/add
缓存失效后权限不更新?别只清 runtime/cache
Auth 权限数据缓存在 cache/auth_{$uid},但很多人清缓存只删 runtime/cache/ 下文件,忘了 Auth 类默认用的是 File 缓存驱动,且 key 带前缀。更麻烦的是:如果改了角色权限却没触发 Auth::clearCache($uid),用户下次访问仍用旧缓存。
实操建议:
- 后台修改角色权限后,必须调用
Auth::clearCache($uid)清指定用户缓存;若批量修改,用Cache::tag('auth')->clear()(前提是配置了缓存标签支持) - 开发环境可临时关闭缓存:在
config/auth.php中设'cache' => false,但上线前务必改回 true,否则每次请求都查库 - 别用
php think clear:cache命令清 Auth 缓存——它只清系统级缓存,不清 Auth 自定义 key
权限模型最易被忽略的其实是「路由名和权限名的映射一致性」,不是逻辑写得不够复杂,而是两个字符串对不上——一个少了个 /admin 前缀,另一个多了个 .html 后缀,问题就卡在这儿。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











