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

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());
}

逻辑说明

  1. 先通过邮箱查询用户,避开Auth::attempt对未激活用户的直接过滤
  2. 验证密码是否匹配,不匹配则抛出默认登录失败错误
  3. 密码匹配但用户未激活时,存入session提示消息,再抛出错误
  4. 所有验证通过后,手动调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:28:34