Auth::check()总返回false的根本原因是登录后未调用Auth::setUser($uid)填充缓存;正确获取权限节点应优先用$request->rule()->getName(),确保与auth_rule.name完全一致。

自定义函数里怎么取当前路由权限节点
直接拼 request()->module().'/'.request()->controller().'/'.request()->action() 是错的——它生成的是 admin/user/delete,但你的路由规则名可能是 admin/user/:id 或 admin.user.delete,Auth::check() 会因不匹配始终返回 false。
正确做法是优先从路由对象取真实规则名:
- TP5.1+:用
$request->rule()->getName()(返回如admin/user/delete) - TP5.0:退而求其次用
$request->dispatch()['rule'](注意它可能是数组或字符串,需判空) - 拿到后统一转小写、斜杠分隔(如把点号替换为
/),确保和auth_rule.name字段值完全一致
为什么 Auth::check() 在自定义函数里总失败
根本原因不是函数写得不对,而是缓存没填。TP5 的 Auth 类默认只查 session 或缓存里的权限列表,但登录成功后你没调 Auth::setUser($uid),缓存就是空的。
常见错误链:
- 用户登录成功 → 写了
session('uid', $uid) - 但没紧接着执行
Auth::setUser($uid) - 后续任何地方调
Auth::check('xxx')都查不到数据 → 永远false
这个调用必须在登录逻辑的同一请求内完成,不能等到跳转后、不能放在中间件里延迟执行。
自定义鉴权函数怎么避免重复查库
每次请求都查 auth_role_access 表,性能扛不住。缓存策略要明确:
- 缓存 key 必须含角色 ID,例如
auth_rules_5(别用通用 key) - 缓存内容是该角色拥有的所有
auth_rule.name字符串数组(不是全表记录) - 缓存未命中时才查关联表,查完立刻写入,过期时间设为
1800(30 分钟) - 权限变更时,必须主动删对应
auth_rules_{$roleId}缓存,否则新权限不生效
别在函数里硬编码权限节点名
写成 Auth::check('admin/user/delete', $uid) 看似简单,但一旦路由改名(比如从 delete 改成 remove),所有调用点都要改,极易漏。
更可靠的方式是让函数自动推导:
- 传入
$request对象,由函数内部调$request->rule()->getName() - 对超级管理员做白名单兜底(如
in_array($uid, explode(',', config('auth_superadmin')))) - 函数返回布尔值,控制器里只管用:
if (!checkAuth($request, $uid)) { return json(['code'=>403]); }
真正难的不是写函数,而是所有人遵守同一条规则:权限节点名 = 路由规则名,一个字符都不能差。改路由,必须同步改权限表、菜单配置、前端按钮标识——少一环,就漏鉴权。

















