You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:06:02