Laravel 10 如何自定义中间件验证用户权限并返回 JSON 格式

文章导读
在 Laravel 10 中实现自定义中间件权限验证并返回 JSON,关键在于中间件必须返回完整的 Response 实例且状态码需明确设定为 403 或 401,否则可能触发 TypeError: Response must be an instance of Symfony\Component\HttpFoundation\Response 错误。
📋 目录
  1. 原因分析
  2. 解决方案
  3. 注意事项
  4. 参考来源
A A

在 Laravel 10 中实现自定义中间件权限验证并返回 JSON,关键在于中间件必须返回完整的 Response 实例且状态码需明确设定为 403 或 401,否则可能触发 TypeError: Response must be an instance of Symfony\Component\HttpFoundation\Response 错误。

原因分析

许多开发者误以为在中间件中不调用 $next($request) 即可终止请求,但若未 return 响应实例,Laravel 会继续执行后续流程导致报错。根据 2026 年 4 月 17 日的技术资料,仅 return false 或 null 不会中断请求,且 Laravel 10+ 默认中间件可能返回 HTML 响应,若 API 场景未显式设置 Content-Type: application/json,框架会按路由类型 fallback 导致格式错误。

解决方案

1. 创建与编写中间件

使用命令 php artisan make:middleware MustBeAdmin 生成文件,在 app/Http/Middleware/MustBeAdmin.php 的 handle 方法中,权限校验失败时直接 return response()->json(['error' => 'Unauthorized'], 403)。

Laravel 10 如何自定义中间件验证用户权限并返回 JSON 格式

2. 注册中间件

打开 app/Http/Kernel.php,在 $routeMiddleware 数组中追加 'mustAdmin' => \App\Http\Middleware\MustBeAdmin::class,确保路由能识别该标识。

3. 全局异常处理

在 app/Exceptions/Handler.php 的 render() 方法中检测 $request->expectsJson(),对 ModelNotFoundException 返回 404 状态码,对验证失败捕获 HttpResponseException 并返回 422 状态码。

Laravel 10 如何自定义中间件验证用户权限并返回 JSON 格式

注意事项

1. 避免双重编码:不要手动 json_encode 后再传给 response()->json(),否则前端解析会失败。2. 请求头验证:中间件读取头信息应直接用 $request->header('X-API-Key') 而非 $_SERVER,空值判断必须用 empty()。3. 调试模式影响:若 APP_DEBUG=true 且未重写异常处理器,开发环境默认返回 HTML 错误页而非 JSON,需确保 Accept: application/json 请求头已发送。

参考来源

来源:CSDN 博客 - Laravel 10 表单请求验证消息自定义实践 (2025 年 11 月 28 日)

Laravel 10 如何自定义中间件验证用户权限并返回 JSON 格式

来源:腾讯云开发者社区 - Laravel 使用中间件进行权限控制 (2026 年 4 月 14 日)

来源:技术知识库 - Laravel 怎么处理自定义中间件终止请求 (2026 年 4 月 17 日)