Laravel JWT认证如何限制仅状态为active的用户可登录
Laravel JWT认证新增账号禁用逻辑改造方案
具体改造步骤
- 校验账号状态逻辑加在JWT凭证验证通过之后
当JWTAuth::attempt($credentials)验证凭证通过并生成token后,先获取当前认证通过的用户实例,检查其status字段值:如果为inactive则直接销毁已生成的token,返回禁用提示。 - 可选扩展:新增全局中间件做状态校验
如果需要实现「已登录用户被管理员禁用后立刻失效」的效果,可单独写一个auth中间件,每次接口请求都校验当前登录用户的status字段,非active状态直接强制登出返回错误。
修改后的完整authenticate方法代码
public function authenticate(UserRequest $request) { $credentials = $request->only('email', 'password'); $request->validated(); //Request is validated try { if (!$token = JWTAuth::attempt($credentials)) { $message = '登录凭证无效'; $data = []; return response()->failed($message, $data); } // 新增:校验用户账号状态 $user = auth()->user(); if ($user->status == 'inactive') { // 销毁已生成的无效token JWTAuth::invalidate($token); $message = '当前账号已被禁用,请联系系统管理员'; $data = []; return response()->failed($message, $data, 403); } } catch (JWTException $e) { // 注意:原代码此处多余的return $credentials;会导致后续错误响应无法执行,已删除 return response()->json([ 'status' => false, 'message' => '无法生成token', 'error' => $e->getMessage() ], 500); } //Token created, return with success response and jwt token $message = '登录成功'; $data = [ 'token' => $token ]; return response()->success($message, $data); }
补充说明
原代码catch块中的return $credentials;属于冗余错误代码,会导致JWT生成异常时无法返回正确的500错误响应,上述改造代码中已直接移除。
内容的提问来源于stack exchange,提问作者Emma
相关产品推荐
相关产品推荐

