Laravel 锁定侦听器未触发

问题描述 投票:0回答:1

基本上,我正在开发一个简单的用户管理系统作为我的第一个 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 次登录尝试失败后发生锁定 - 当我测试上述场景时,会发生这种情况:

429_HTTP_ERROR

...但锁定事件尚未触发!我知道这一点是因为从

LockoutListener.php
中可以看出,我在
handle()
函数中设置了一条控制台消息,并且由于某种原因,当用户因 429 HTTP 错误而被锁定时,该消息不会出现在控制台中。我做了很多研究,我已经看到人们展示如何设置这个锁定侦听器 - 我真的不知道我错过了什么。

版本:Laravel 11.16.0(Jetstream/Livewire)

php laravel events routes listener
1个回答
0
投票

您的代码中存在有线问题。

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");
}
© www.soinside.com 2019 - 2024. All rights reserved.