如何快速整合ThinkPHP后台权限体系与开源鉴权插件?
- 内容介绍
- 文章标签
- 相关推荐
本文共计822个文字,预计阅读时间需要4分钟。
不是插件没装好,而是ThinkPHP 6默认不自动注册门面类(Facade)。插件开发者可能假设你使用了旧版TP5的自动加载机制,但TP6已经将auth门面从核心移除了。
- 手动在
app/provider.php里加一行:think\auth\AuthFacade::class - 或者更稳妥的做法:别用门面,改用容器获取实例——
app()->make('auth') - 如果用了多应用模式,确认
config/auth.php放在对应应用目录下(比如app/admin/config/auth.php),而不是根config/
RBAC 表结构迁移后权限始终不生效
常见原因是中间表字段名和插件默认约定不一致。Think-Auth 默认查的是 auth_group_access 表里的 uid 和 group_id,但有人手建表时写成 user_id 或 role_id。
- 检查
config/auth.php中的'group_access_table'和字段配置,必须和实际数据库一致 -
'user_id_field'默认是'uid',如果你的用户表主键叫id,这里就得改成'id' - 别忘了给用户分配分组后,调用
Auth::clearCache()清缓存,否则新权限下次请求才生效
如何让 Auth::check() 在中间件里正确拦截非授权请求
TP6 的中间件执行时机早于控制器初始化,此时 Auth 实例可能还没加载用户信息。直接在中间件里调 Auth::check('admin/edit') 很容易返回 false,哪怕用户已登录且有权限。
- 确保中间件放在
app/middleware.php的'http'数组里,且位置在SessionInit之后 - 不要在中间件里依赖
Auth::id(),改用Auth::getUser()并判断返回值是否为 null - 权限检测建议用白名单方式:先定义允许访问的路由,再用
Auth::check()检查当前路由名,比传字符串路径更可靠
和 JWT 登录混用时 token 过期后权限校验失效
Think-Auth 默认从 Session 或 Cookie 读用户 ID,而 JWT 是无状态的,每次请求都靠 Header 里的 token 解析出用户身份。两者底层用户识别机制冲突。
立即学习“PHP免费学习笔记(深入)”;
- 必须重写
Auth的getUser()方法,让它优先从 JWT token 中解析uid,而不是查 session - 在
config/auth.php中关闭'use_session',并设置'user_model'指向你自己的 JWT 用户模型 - 注意:权限缓存键会包含用户来源标识,JWT 用户和 Session 用户的缓存不能共用,否则一个登出会影响另一个
Auth 类内部的用户 ID 来源、缓存 key 构造、甚至数据库查询条件,都得按来源分别处理。本文共计822个文字,预计阅读时间需要4分钟。
不是插件没装好,而是ThinkPHP 6默认不自动注册门面类(Facade)。插件开发者可能假设你使用了旧版TP5的自动加载机制,但TP6已经将auth门面从核心移除了。
- 手动在
app/provider.php里加一行:think\auth\AuthFacade::class - 或者更稳妥的做法:别用门面,改用容器获取实例——
app()->make('auth') - 如果用了多应用模式,确认
config/auth.php放在对应应用目录下(比如app/admin/config/auth.php),而不是根config/
RBAC 表结构迁移后权限始终不生效
常见原因是中间表字段名和插件默认约定不一致。Think-Auth 默认查的是 auth_group_access 表里的 uid 和 group_id,但有人手建表时写成 user_id 或 role_id。
- 检查
config/auth.php中的'group_access_table'和字段配置,必须和实际数据库一致 -
'user_id_field'默认是'uid',如果你的用户表主键叫id,这里就得改成'id' - 别忘了给用户分配分组后,调用
Auth::clearCache()清缓存,否则新权限下次请求才生效
如何让 Auth::check() 在中间件里正确拦截非授权请求
TP6 的中间件执行时机早于控制器初始化,此时 Auth 实例可能还没加载用户信息。直接在中间件里调 Auth::check('admin/edit') 很容易返回 false,哪怕用户已登录且有权限。
- 确保中间件放在
app/middleware.php的'http'数组里,且位置在SessionInit之后 - 不要在中间件里依赖
Auth::id(),改用Auth::getUser()并判断返回值是否为 null - 权限检测建议用白名单方式:先定义允许访问的路由,再用
Auth::check()检查当前路由名,比传字符串路径更可靠
和 JWT 登录混用时 token 过期后权限校验失效
Think-Auth 默认从 Session 或 Cookie 读用户 ID,而 JWT 是无状态的,每次请求都靠 Header 里的 token 解析出用户身份。两者底层用户识别机制冲突。
立即学习“PHP免费学习笔记(深入)”;
- 必须重写
Auth的getUser()方法,让它优先从 JWT token 中解析uid,而不是查 session - 在
config/auth.php中关闭'use_session',并设置'user_model'指向你自己的 JWT 用户模型 - 注意:权限缓存键会包含用户来源标识,JWT 用户和 Session 用户的缓存不能共用,否则一个登出会影响另一个
Auth 类内部的用户 ID 来源、缓存 key 构造、甚至数据库查询条件,都得按来源分别处理。
