基本上,我正在开发一个简单的用户管理系统作为我的第一个 Laravel 项目,但在设置帐户锁定事件侦听器时遇到了一些问题。
Laravel 在登录尝试失败次数过多后提供帐户锁定功能,我正在尝试将与该功能相关的数据存储在数据库中。在我的用户表中,我有一个布尔值
account_locked
列,默认设置为 false
,当用户登录失败次数过多后被锁定时,我需要将其设置为 true
。以下是相关类:
EventServiceProvider.php:
namespace App\Providers;
use Illuminate\Auth\Events\Lockout;
use App\Listeners\LockoutListener;
use Illuminate\Support\ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
protected $listen = [
Failed::class => [
FailedLoginListener::class,
],
Lockout::class => [
LockoutListener::class,
],
Authenticated::class => [
SuccessfulLoginListener::class,
],
];
}
Lockout.php:
namespace Illuminate\Auth\Events;
use Illuminate\Http\Request;
class Lockout
{
public $request;
public function __construct(Request $request)
{
$this->request = $request;
}
}
LockoutListener.php:
namespace App\Listeners;
use App\Models\User;
use Illuminate\Auth\Events\Lockout;
class LockoutListener
{
public function handle(Lockout $event): void
{
error_log('Lockout event triggered!');
User::where('email', $event->request->user->email)->update(['account_locked' => true]);
}
}
就我的应用程序而言,由于我使用的是 Jetstream/Fortify,默认设置为在一分钟内 5 次登录尝试失败后发生锁定 - 当我测试上述场景时,会发生这种情况:
...但锁定事件尚未触发!我知道这一点是因为从
LockoutListener.php
中可以看出,我在 handle()
函数中设置了一条控制台消息,并且由于某种原因,当用户因 429 HTTP 错误而被锁定时,该消息不会出现在控制台中。我做了很多研究,我已经看到人们展示如何设置这个锁定侦听器 - 我真的不知道我错过了什么。
版本:Laravel 11.16.0(Jetstream/Livewire)
您的代码中存在有线问题。
在
handle
方法中,您尝试访问 $event->request->user->email
。但是,在锁定时,可能不存在经过身份验证的用户。相反,您应该从请求输入访问电子邮件。
所以它看起来像这样
$email = $event->request->input('email');
if ($email) {
User::where('email', $email)->update(['account_locked' => true]);
error_log("Account locked for email: $email");
}