Laravel中ApiBaseController鉴权失效求助:错误token未返回拒付响应
解决Laravel基类控制器鉴权不生效的问题
这个问题我之前也碰到过,核心原因是Laravel控制器构造函数的返回值不会被框架自动处理——就算你在构造里return了JSON响应,程序还是会继续执行子类的业务方法,这就是错误token下还能返回业务数据的原因。下面给你两种靠谱的解决办法:
方法一:使用中间件(推荐,符合Laravel最佳实践)
Laravel的中间件本来就是用来处理请求前置校验的,用它来做token验证更规范,也方便后续扩展:
创建Token验证中间件
执行Artisan命令生成中间件:php artisan make:middleware VerifyAppToken编写中间件逻辑
打开生成的app/Http/Middleware/VerifyAppToken.php,替换handle方法内容:<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class VerifyAppToken { public function handle(Request $request, Closure $next) { // 校验请求头的app-token if ($request->header('app-token') !== 'ofdsafalkhguddskjafl01JhBF9mGx2jay') { return response()->json([ 'success'=>false, 'status'=>'401', 'message'=>'Token Denied !', 'response'=>[ 'total'=>0, 'data'=>[] ] ], 401); } // 验证通过,继续执行后续请求 return $next($request); } }注册中间件
打开app/Http/Kernel.php,在$routeMiddleware数组里添加中间件别名:protected $routeMiddleware = [ // 其他中间件... 'auth.app-token' => \App\Http\Middleware\VerifyAppToken::class, ];在基类控制器中调用中间件
修改ApiBaseController的构造函数,用middleware方法挂载中间件:class ApiBaseController extends Controller { protected $user; public function __construct() { // 先执行token验证中间件 $this->middleware('auth.app-token'); // 验证通过后再处理用户信息 $this->user = Auth::guard('api')->user(); } }
方法二:在构造函数中终止请求(快速解决)
如果不想用中间件,也可以直接在构造函数里用abort助手函数抛出响应,强制终止请求流程:
修改ApiBaseController的构造函数:
class ApiBaseController extends Controller { protected $user; public function __construct() { if (request()->header('app-token') != 'ofdsafalkhguddskjafl01JhBF9mGx2jay'){ // 用abort直接返回自定义JSON响应,终止请求 abort(response()->json([ 'success'=>false, 'status'=>'401', 'message'=>'Token Denied !', 'response'=>[ 'total'=>0, 'data'=>[] ] ], 401)); } else{ $this->user = Auth::guard('api')->user(); } } }
这样当token错误时,abort会直接触发响应,不会再执行子类的业务方法。
内容的提问来源于stack exchange,提问作者Ray Coder
相关产品推荐
相关产品推荐

