导读:本期聚焦于小伙伴创作的《Laravel 8 Breeze教程:实现用户活跃状态登录校验与状态控制功能》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Laravel 8 Breeze教程:实现用户活跃状态登录校验与状态控制功能》有用,将其分享出去将是对创作者最好的鼓励。

在 Laravel 8 Breeze 中实现用户活跃状态登录校验

Laravel Breeze 是官方提供的轻量级认证脚手架,能够快速搭建登录、注册、密码重置等基础认证功能。在实际业务场景中,我们通常需要限制未激活的用户登录系统,仅允许状态为活跃的用户完成登录操作。本文将介绍如何在 Laravel 8 Breeze 的基础上,实现用户活跃状态的登录校验逻辑。

前置准备

首先确保已经完成 Laravel 8 项目的创建,并且通过 Composer 安装了 Breeze 扩展包,执行以下命令完成基础安装:

composer require laravel/breeze --dev
php artisan breeze:install
npm install && npm run dev
php artisan migrate

安装完成后,数据库中会生成 users 表,我们需要在 users 表中新增一个字段用于存储用户的活跃状态。

新增用户活跃状态字段

首先创建数据库迁移文件,添加 is_active 字段到 users 表:

php artisan make:migration add_is_active_to_users_table

打开生成的迁移文件,在 up 方法中添加字段定义:

<?php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

class AddIsActiveToUsersTable extends Migration
{
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->boolean('is_active')->default(true)->comment('用户活跃状态,true为活跃,false为未激活');
        });
    }

    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('is_active');
        });
    }
}

执行迁移命令更新数据库结构:

php artisan migrate

调整用户模型

打开 app/Models/User.php 文件,添加 is_active 字段到可批量赋值属性中,同时可以定义一个访问器方便后续判断:

<?php

namespace AppModels;

use IlluminateContractsAuthMustVerifyEmail;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;

class User extends Authenticatable
{
    use HasFactory, Notifiable;

    protected $fillable = [
        'name',
        'email',
        'password',
        'is_active',
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
        'is_active' => 'boolean',
    ];

    // 判断用户是否为活跃状态
    public function isActive()
    {
        return $this->is_active === true;
    }
}

自定义登录校验逻辑

Laravel Breeze 的登录逻辑由 AppHttpControllersAuthAuthenticatedSessionController 控制器处理,默认的 store 方法仅校验邮箱和密码的正确性,我们需要在此基础上增加活跃状态校验。

首先打开 app/Http/Controllers/Auth/AuthenticatedSessionController.php 文件,修改 store 方法的实现:

<?php

namespace AppHttpControllersAuth;

use AppHttpControllersController;
use AppHttpRequestsAuthLoginRequest;
use AppModelsUser;
use IlluminateHttpRequest;
use IlluminateHttpResponse;
use IlluminateSupportFacadesAuth;

class AuthenticatedSessionController extends Controller
{
    // 其他方法保持不变

    public function store(LoginRequest $request)
    {
        $request->authenticate();

        // 获取当前尝试登录的用户
        $user = User::where('email', $request->email)->first();

        // 校验用户是否为活跃状态
        if ($user && !$user->isActive()) {
            Auth::logout();
            return back()->withErrors([
                'email' => '该账号未激活,无法登录系统。',
            ]);
        }

        $request->session()->regenerate();

        return redirect()->intended(route('dashboard', absolute: false));
    }
}

上述逻辑中,我们先执行默认的认证流程,认证通过后查询对应的用户实例,判断其 is_active 状态:如果状态为未激活,则立即注销当前登录会话,并返回错误提示。

验证登录请求类调整(可选)

为了让校验逻辑更靠前,也可以在 LoginRequest 类中提前校验用户状态,避免不必要的认证流程。打开 app/Http/Requests/Auth/LoginRequest.php 文件,修改 authenticate 方法:

<?php

namespace AppHttpRequestsAuth;

use AppModelsUser;
use IlluminateAuthEventsLockout;
use IlluminateFoundationHttpFormRequest;
use IlluminateSupportFacadesAuth;
use IlluminateSupportFacadesRateLimiter;
use IlluminateSupportStr;
use IlluminateValidationValidationException;

class LoginRequest extends FormRequest
{
    // 其他方法保持不变

    public function authenticate(): void
    {
        $this->ensureIsNotRateLimited();

        // 先查询用户是否存在并校验状态
        $user = User::where('email', $this->input('email'))->first();

        if ($user && !$user->isActive()) {
            RateLimiter::hit($this->throttleKey());
            throw ValidationException::withMessages([
                'email' => '该账号未激活,无法登录系统。',
            ]);
        }

        if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
            RateLimiter::hit($this->throttleKey());

            throw ValidationException::withMessages([
                'email' => trans('auth.failed'),
            ]);
        }

        RateLimiter::clear($this->throttleKey());
    }
}

这种方式的校验会在账号密码校验之前执行,优先判断用户状态,逻辑更清晰。

前端错误提示展示

Laravel Breeze 的登录页面默认会展示验证错误信息,我们不需要额外修改前端代码,错误提示会自动显示在登录表单上方。如果需要自定义提示位置,可以打开 resources/views/auth/login.blade.php 文件,在表单中添加错误显示逻辑:

@if ($errors->any())
    <div class="mb-4">
        <div class="font-medium text-red-600">
            登录失败,请检查以下问题:
        </div>

        <ul class="mt-3 list-disc list-inside text-sm text-red-600">
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

测试验证效果

完成上述配置后,我们可以进行测试:

  • 新建一个用户,手动将数据库中该用户的 is_active 字段设置为 0

  • 使用该用户的账号尝试登录系统,会看到提示“该账号未激活,无法登录系统”

  • is_active 字段改回 1 后,再次登录即可正常进入系统

至此,我们就完成了 Laravel 8 Breeze 中用户活跃状态的登录校验功能,后续可以根据业务需求扩展更多用户状态维度的校验逻辑,比如账号封禁、过期校验等。

Laravel Breeze用户活跃状态登录校验状态校验用户状态控制

免责声明:已尽一切努力确保本网站所含信息的准确性。网站部分内容来源于网络或由用户自行发表,内容观点不代表本站立场。本站是个人网站免费分享,内容仅供个人学习、研究或参考使用,如内容中引用了第三方作品,其版权归原作者所有。若内容触犯了您的权益,请联系我们进行处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。前端、网络、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握网站开发与运维所需的核心技术栈。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端逻辑,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。