如何自定义 Laravel Breeze 关于密码被泄露的消息?

How do I customize Laravel Breeze's message about a password being compromised?

提问人:erlango3 提问时间:10/31/2023 更新时间:11/1/2023 访问量:79

问:

我正在使用 Laravel Breeze 开发一个应用程序。当我尝试创建不安全的密码(已泄露/泄露的密码,例如)时,我收到以下验证错误消息:Password1!

给定的密码已出现在数据泄漏中。请选择其他密码。

从我的角度来看,这个消息非常简单,但从最终用户的角度来看,恐怕不是那么清楚。事实上,阅读此消息的最终用户可能会怀疑数据是否在我正在处理的网站上泄露,并且觉得正在访问的网站并不安全,而这实际上是提供了额外的安全性。这就是为什么我想为这样的事情自定义我的消息:

给定的密码是网络上某个时候泄漏的一部分。作为一项安全措施,我们已阻止其在本网站上的使用。

技术:

  • PHP 8.1的
  • 拉拉维尔 10.10
  • 拉拉维尔微风 1.21

到目前为止,我在 RegisteredUserController 中尝试了什么

    public function store(Request $request): RedirectResponse
    {
        $rules = [
            [other rules],
            'password'      => ['required', 'confirmed', Password::min(8)->mixedCase()->letters()->numbers()->symbols()->uncompromised()],
        ];

        $messages = [
            'password.uncompromised' => 'The given password was part of a leak at some point on the Web. As a security measure, we have blocked its use on this site.',
        ];

        $this->validate($request, $rules, $messages);

        Auth::login($user = User::create([
            [other stuff]
            'password'      => Hash::make($request->password),
        ]));

        event(new Registered($user));

        Auth::login($user);

        (new MyController)->store($request);

        return redirect()->route('register_step_2');
    }

当我使用上面的代码时会发生什么

当我使用上面提供的代码时,默认错误消息是传递到用户界面的内容,而不是我的自定义消息。

Laravel Passwords 用户体验 Laravel-Breeze

评论

0赞 Yusuf Bouzekri 10/31/2023
这是 breeze 的内置功能吗?我只是尝试了一下,但没有用。Password1!
0赞 apokryfos 10/31/2023
@YusufBouzekri它旨在成为 Laravel 的一部分,请参阅验证密码
0赞 Yusuf Bouzekri 10/31/2023
我按照文档说的做了,它就像一个魅力,疯狂的 laravel 必须提供多少很酷的东西@apokryfos
0赞 Mr. Kenneth 10/31/2023
您是否尝试删除 in the chain 方法并将其添加为字符串元素?uncompromisedPasswordconfirmed
0赞 erlango3 10/31/2023
@Mr.Kenneth:我就是这样。这给了我一个 500 错误。我在文档中没有找到任何关于用作字符串而不是阻止泄露密码的方法的可能性的参考。uncompromised

答:

1赞 Billal Begueradj 11/1/2023 #1

似乎不仅如此,而且自定义规则对象(在 Password.php 中使用)的所有剩余内置方法都是这种情况,并且文档根本没有涵盖这种情况。uncompromised()

到目前为止,我发现这些内置方法的唯一解决方法是运行 .然后,您将看到一个添加到应用程序根目录的 lang/ 目录,您可以在其中找到验证 .php 文件的关联数组中的键,并将其值更改为所需的任何值:php artisan lang:publish

enter image description here

这是我在RegisteredUserController.php中使用的一小段代码:

public function store(Request $request): RedirectResponse
    {
        $messages = [
            // For non built-in methods, this works as mentioned in the documentation
            'name.required' => 'We need your name',
        ];
        $rules = [
            'name' => ['required', 'string'],
            'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class],
            'password' => ['required', 'confirmed', Password::min(5)->uncompromised()]
        ];
        $request->validate($rules, $messages);
        // The rest of code      
    }

以下是上述代码和更改的结果:

enter image description here

评论

0赞 Billal Begueradj 11/27/2023
这实际上是一个错误,并在这个拉取请求中解决了(在提出这个问题几周后)。在 Laravel 10.33 及更高版本中,您可以改用经典方式解决 OP 的问题