在 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 中用户活跃状态的登录校验功能,后续可以根据业务需求扩展更多用户状态维度的校验逻辑,比如账号封禁、过期校验等。