Laravel 10 Breeze用户未激活自定义闪存消息报错:is_active空属性读取错误
问题原因及解决方案
错误原因
你遇到的Attempt to read property "is_active" on null错误,核心问题出在Auth::attempt()的逻辑设计上:
- 你在
attempt的参数里附加了['is_active' => true],这意味着只有当「邮箱密码正确且用户已激活」时,attempt才会返回true并将用户实例载入认证系统。 - 一旦用户未激活(或者邮箱密码错误),
attempt直接返回false,且不会载入任何用户实例,此时Auth::user()就是null,自然无法读取is_active属性。
解决方案
需要调整认证逻辑,先单独验证邮箱和密码的正确性,拿到用户实例后再检查激活状态,修改后的authenticate方法如下:
public function authenticate(): void { $this->ensureIsNotRateLimited(); // 根据输入的邮箱获取用户实例 $user = User::where('email', $this->input('email'))->first(); // 验证密码是否匹配 if (!$user || !Hash::check($this->input('password'), $user->password)) { RateLimiter::hit($this->throttleKey()); throw ValidationException::withMessages([ 'email' => trans('auth.failed'), ]); } // 密码正确,检查用户是否激活 if (!$user->is_active) { RateLimiter::hit($this->throttleKey()); Session::flash('active', '用户未激活,请联系管理员。'); throw ValidationException::withMessages([ 'email' => trans('auth.failed'), ]); } // 验证通过,执行登录操作 Auth::login($user, $this->boolean('remember')); RateLimiter::clear($this->throttleKey()); }
逻辑说明
- 先通过邮箱查询用户,避开
Auth::attempt对未激活用户的直接过滤 - 验证密码是否匹配,不匹配则抛出默认登录失败错误
- 密码匹配但用户未激活时,存入session提示消息,再抛出错误
- 所有验证通过后,手动调用
Auth::login完成登录
另外,你可以调整视图里的文字颜色让样式更协调(把text-teal-900改为text-red-900):
@if(Session::has('active')) <div class="bg-red-100 border-t-4 border-red-500 rounded-b text-red-900 px-4 py-3 shadow-md mb-6" role="alert"> <div class="flex align-center justify-center"> <div> <p class="font-bold">{{ Session::get('active') }}</p> </div> </div> </div> @endif
内容的提问来源于stack exchange,提问作者Raitiko
相关产品推荐
相关产品推荐

