接口权限校验必须使用路由规则名(如admin/user/delete),而非url路径或方法名;登录后须立即调用auth::setuser($uid)填充缓存,否则auth::check()始终返回false。

接口权限必须用路由规则名(如 admin/user/delete)做校验依据,不能靠 URL 路径或控制器方法名——否则中间件根本拦不住真实请求。
为什么 Auth::check() 对接口没反应
TP5 自带的 Auth 类默认只查 session 缓存里的权限列表,但登录后没人调用 Auth::setUser($uid),缓存就是空的。结果 Auth::check('admin/user/delete') 永远返回 false,而你还在奇怪“按钮都隐藏了,怎么 POST 还能成功”。
- 登录成功后必须立刻执行
Auth::setUser($uid),不是跳转后、不是进首页后,是 auth controller 里写完 session 紧接着就调 - 别在中间件里直接用
$request->url()或$request->action()拼权限名——admin/user/delete和user/delete是两回事,得严格对齐路由定义 - 如果你用的是
Route::post('admin/user/:id', 'UserController@delete'),那权限节点名只能是admin/user/:id或更稳妥的admin/user/delete(建议统一用固定标识)
中间件里怎么安全拦截接口请求
别在每次请求都查数据库,也别把全量权限塞进 session——改个权限要清所有用户登录态,线上不敢动。
- 中间件
handle()中先取当前路由规则名:$ruleName = $request->rule()->getName()(TP5.1+ 支持;TP5.0 可用$request->dispatch()['rule']) - 把这个名标准化成权限节点格式,比如把
admin.user.delete→admin/user/delete,和auth_rule.name字段完全一致 - 查缓存:
cache('auth_rules_' . $roleId),里面存的是该角色拥有的name字符串数组(Redis 的SMEMBERS或 PHP array 都行) - 缓存未命中才查
auth_role_access关联表,生成数组并写入缓存,过期时间设为 15–30 分钟,key 必须含$roleId
auth_rule 表字段设计最容易翻车的三个点
很多人加了一堆字段,结果一上线就慢、一改权限就失效、一加新接口就漏拦截。
-
name字段必须唯一且小写+斜杠分隔(如admin/user/edit),禁止用中文、ID、下划线或点号——它要和路由规则名 1:1 匹配 -
type字段只存两个值:1(菜单)、2(操作),别加3=API或4=按钮,中间件只认这两个来区分是否需要鉴权 -
condition字段留空,除非你真需要动态 SQL 条件(比如“仅允许编辑自己创建的文章”)。填了它,每次鉴权都会执行一次where查询,容易被注入,也拖慢响应
真正难的不是建三张表,而是让每个开发都记住:权限节点不是随便起的代号,它是路由规则的镜像;改一个节点名,前后端、菜单、按钮、接口拦截全部要同步——漏掉任意一环,权限系统就形同虚设。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











