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

Laravel如何为已停用/软删除用户自定义登录失败提示信息

实现方案

你可以通过重写LoginController中AuthenticatesUsers Trait 提供的3个核心方法实现需求,修改后完全不影响原有正常登录逻辑,仅针对软删用户返回专属提示:

  1. 首先修改原有credentials方法,移除deleted_at过滤条件,方便后续单独判断软删状态
protected function credentials(Request $request)
{
    return [
        'email' => $request->input('email'),
        'password' => $request->input('password')
    ];
}
  1. 重写attemptLogin方法,增加软删用户的校验逻辑,校验命中时给session打标记
protected function attemptLogin(Request $request)
{
    $credentials = $this->credentials($request);
    // 查询时包含软删用户
    $user = \App\Models\User::where('email', $credentials['email'])->withTrashed()->first();

    // 匹配到用户、密码正确、且属于软删状态时返回失败并打标记
    if ($user && \Hash::check($credentials['password'], $user->password) && !is_null($user->deleted_at)) {
        session()->flash('account_disabled', true);
        return false;
    }

    // 原有正常登录验证逻辑,自动过滤软删用户
    return $this->guard()->attempt(
        $credentials, $request->boolean('remember')
    );
}
  1. 重写sendFailedLoginResponse方法,根据session标记返回不同错误提示
// 注意控制器顶部要先引入异常类:use Illuminate\Validation\ValidationException;
protected function sendFailedLoginResponse(Request $request)
{
    if (session()->has('account_disabled')) {
        throw ValidationException::withMessages([
            'email' => ['Your account has been deleted'],
            // 中文提示可以改成:'您的账号已被停用/删除'
        ]);
    }

    // 正常凭证错误场景保留原有提示
    throw ValidationException::withMessages([
        'email' => [trans('auth.failed')],
    ]);
}

逻辑说明

  • 账号不存在/密码错误/账号正常的场景:全部走原有默认错误提示,和之前逻辑完全一致
  • 账号已软删、且密码输入正确:仅返回专属停用提示,不会额外泄露账号存在状态

内容的提问来源于stack exchange,提问作者q55awr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 17:27:03