TP8.0 实现简单的 RBAC 权限控制中间件链【鉴权】

小瑶大大_4034

小瑶大大_4034

2026-07-16

297人浏览

原创

在thinkphp 8.0中,通过注册authcheck中间件(置于路由匹配后)、使用$request->rule()->getname()获取路由名、区分游客/超管、调用authservice::check()校验权限,可实现不依赖第三方、不改核心、不写sql的rbac控制。

tp8.0 实现简单的 rbac 权限控制中间件链【鉴权】

在 ThinkPHP 8.0 中快速搭建可运行的 RBAC 权限控制中间件链,要求不依赖第三方扩展、不修改核心 Auth 类、不手写 SQL 查询,且能准确拦截未授权请求并区分游客与超管。

注册中间件到 HTTP 链并确保执行时机正确

打开 app/middleware.php,找到 'http' => [] 数组,在靠后位置插入你的权限中间件类名,例如放在 SessionInit::class 和 AllowCrossDomain::class 之后,但不能放在已有鉴权中间件(如 CheckAuth::class)之后——否则会重复校验或错过路由解析结果。

这一步操作起来很简单,直接把字符串追加进数组就行:app\middleware\AuthCheck::class。

【中间件必须注册在路由匹配完成之后】。如果放太靠前,$request->rule()->getName() 会返回空或控制器反射路径(如 \app\controller\Admin\UserController@list),导致后续所有权限比对失效。

编写 AuthCheck 中间件类

在 app/middleware/AuthCheck.php 中创建类,继承 think\middleware\Middleware。

第一步:从请求对象中获取当前路由名,必须用 $request->rule()->getName(),不要用 $request->url() 或拼接 $request->controller() . '.' . $request->action()——大小写和命名风格极易出错,且无法兼容资源路由自动注册的七种动作(如 article/create)。

第二步:判断是否为游客(未登录)。检查 session('user_id') 是否存在,不存在则重定向到登录页:return redirect('/login')->with('msg', '请先登录');。

第三步:判断是否为超管。查用户表字段 is_super = 1,满足则直接 return $next($request) 放行,跳过全部权限查询。

第四步:非游客非超管时,调用自定义权限服务进行校验。不要在中间件里硬编码查询逻辑,应封装成 app\service\AuthService::check($routeName, $uid) 方法,内部走「用户→角色→权限」三级链路,最终返回布尔值。

实现 AuthService 权限校验服务

方法一:使用 ThinkPHP 自带 Auth 类(需提前配置好)

确保登录成功后已执行 Auth::setUser($uid),这是权限缓存生效的前提;否则 Auth::check() 永远返回 false。

ThinkPHP5.1企业站点快速开发-源码课件
ThinkPHP5.1企业站点快速开发-源码课件

ThinkPHP5.1企业站点快速开发

下载

在 AuthService::check() 中调用:Auth::check($routeName, $uid, 'admin') ——注意第三个参数传应用名,多应用模式下不传会默认查 app 应用下的规则,导致权限名匹配失败。

方法二:手动查四表关联(更可控,推荐)

① 根据 $uid 查 auth_group_access 表得 role_id 列表;

② 用这些 role_id 查 auth_role_rule 得 rule_id 集合;

③ 联查 auth_rule 表,提取 rule_name 字符串数组(如 ['admin.user.list', 'admin.user.delete']);

④ 用 in_array($routeName, $rules) 判断是否命中。

【权限名必须与路由定义完全一致】。比如路由定义是 Route::get('admin/user/list', 'admin.UserController@list')->name('admin.user.list');,那对应权限名只能是 admin.user.list,不能是 admin/user/list 或 user_list。

确保路由显式命名且权限表数据对齐

打开 route/app.php,所有需要权限控制的路由必须显式调用 ->name('xxx')。没有 name 的路由,$request->rule()->getName() 就拿不到有效值。

往 auth_rule 表插入数据时,name 字段必须与上述 ->name() 参数完全一致,包括大小写、点号分隔、无多余斜杠。

别把权限写成 user:edit 或 /admin/user/edit,ThinkPHP RBAC 不识别这种格式。

插入示例:INSERT INTO `auth_rule` (`name`, `title`, `type`) VALUES ('admin.user.list', '用户列表页', 1);

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

thinkphp

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

2024.05.11

609

5

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

2025.12.18

604

18

ThinkPHP中间件机制与请求拦截处理实践
ThinkPHP中间件机制与请求拦截处理实践

本专题围绕 ThinkPHP 中间件体系展开,深入讲解中间件的定义、注册与执行流程。内容包括全局中间件与路由中间件的区别、请求前后处理逻辑、自定义中间件开发以及权限验证与日志处理应用。通过实际案例,帮助开发者掌握中间件在项目中的核心作用与最佳实践。

2026.03.31

418

17

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

120

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

100

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

60

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

80

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

280

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程