Laravel如何为已停用/软删除用户自定义登录失败提示信息
实现方案
你可以通过重写LoginController中AuthenticatesUsers Trait 提供的3个核心方法实现需求,修改后完全不影响原有正常登录逻辑,仅针对软删用户返回专属提示:
- 首先修改原有
credentials方法,移除deleted_at过滤条件,方便后续单独判断软删状态
protected function credentials(Request $request) { return [ 'email' => $request->input('email'), 'password' => $request->input('password') ]; }
- 重写
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') ); }
- 重写
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
相关产品推荐
相关产品推荐

