如何覆盖验证规则登录 Laravel\Fortify?

Posted

技术标签:

【中文标题】如何覆盖验证规则登录 Laravel\\Fortify?【英文标题】:How to override the validation rule login Laravel\Fortify?如何覆盖验证规则登录 Laravel\Fortify? 【发布时间】:2021-02-03 10:07:21 【问题描述】:

这在 Laravel\Fortify\Http\Requests\LoginRequest 类中描述 我想再添加一个验证行

namespace Laravel\Fortify\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Laravel\Fortify\Fortify;

class LoginRequest extends FormRequest

/..
    public function rules()
        
            return [
                Fortify::username() => 'required|string',
                'password' => 'required|string',
            ];
        

但我无法在供应商中进行自定义。 我的问题是如何做到这一点?

【问题讨论】:

@JanosAudran 给了你正确的答案。这是实现您打算做的事情的正确方法。正如 Snapey 和 TheSk8rJesus 所指出的,对供应商文件夹进行更改是一种不好的做法。您可以通过更改供应商文件夹来完成工作,但至少可以说这是一种不好的做法。试试 JanosAudran 的建议。 【参考方案1】:

只是添加到上面的评论中,如前所述在供应商文件夹中进行更改是一个坏主意。一方面,任何推送到存储库的代码都不会反映这些更改(除非您修改忽略文件)。

对于 Laravel/Fortify 添加新字段和更改默认验证规则,即使是密码要求也非常简单。我不清楚您的要求是什么,但简单地使用验证器可能更容易。这也是 Fortify 使用的。例如,Fortify 发布了两个文件:

App\Actions\Fortify\CreateNewUser.php
App\Actions\Fortify\PasswordValidationRules.php

要为字段添加新的验证规则,只需将其添加到 Fortify 本身正在使用的 Validator::make 方法下的 CreateNewUser.php 即可。您可以在自定义实现中遵循相同的逻辑。例如添加一个名字字段,修改如下:

Validator::make($input, [
            'firstname' => ['required', 'string', 'max:255'],
        ])->validate();

        return User::create([
            'firstname' => $input['firstname'],
        ]);

您可以添加任意数量的字段。要更改密码要求,请更改 PasswordValidationRules.php 文件中的 passwordRules() 函数,如下所示:

protected function passwordRules()
        
        return ['required', 
        'string', 
        (new Password)->requireUppercase()
        ->length(10)
        ->requireNumeric()
        ->requireSpecialCharacter(), 
        'confirmed'];
    

所有这些信息都可以在官方文档https://jetstream.laravel.com/1.x/features/authentication.html#password-validation-rules中找到

【讨论】:

出于某种原因,这对我不起作用。我尝试输入3个字符的长度并取出确认,但它不起作用,继续等待8个字符并确认 我的问题是关于登录,密码和注册什么都清楚。【参考方案2】:

简而言之,我解决了这样的问题

将 vendor\laravel\fortify\src\Http\Controllers\AuthenticatedSessionController.php 复制到 app\Http\Controllers\Auth\LoginController.php(更改命名空间和类名) 将 vendor\laravel\fortify\src\Http\Requests\LoginRequest.php 复制到 app\Http\Requests\LoginFormRequest.php(更改命名空间和类名)

在 routes/web.php 中添加新路由

use App\Http\Controllers\Auth\LoginController;
//
Route::post('/login', [LoginController::class, 'store'])
        ->middleware(array_filter([
            'guest',
            $limiter ? 'throttle:'.$limiter : null,
        ]));

在 LoginController 中将 LoginRequest 更改为 LoginFormRequest 和

public function store(LoginFormRequest $request)
    
        return $this->loginPipeline($request)->then(function ($request) 
            return app(LoginResponse::class);
        );
    

在 LoginFormRequest 中添加我的新规则

public function rules()
    
        return [
            Fortify::username() => 'required|string',
            'password' => 'required|string',
            'myNewRule' => 'required|string',
        ];
    

【讨论】:

【参考方案3】:

我找到了那个页面:https://dev.to/aibnuhibban/login-customization-in-laravel-8-2gc8

转到供应商 > laravel > fortify > src > Rule > Password.php

在那里你可以改变那些配置。

【讨论】:

但是 Jetstream 的文档提供了一个示例:Password Validation Rules (new Password)->length(10)<br/> <br/> // Require at least one uppercase character...<br/> (new Password)->requireUppercase()<br/> <br/> // Require at least one numeric character...<br/> (new Password)->requireNumeric() 但是我不清楚如何使用它们,在哪里把它们.. 我需要更改登录验证,添加新字段。密码一目了然 您真的不应该在 Vendor 文件夹中进行更改。在您的供应商文件夹中所做的任何更改都将仅限于本地。如果被其他用户克隆,他们将不会收到您的更改。 永远,永远编辑供应商文件夹中的代码。每当您重新部署应用程序或更新包时,它都会被覆盖

以上是关于如何覆盖验证规则登录 Laravel\Fortify?的主要内容,如果未能解决你的问题,请参考以下文章

创建自定义 codeigniter 验证规则

编写一个系统(登录注册验证用户名密码和验证码覆盖存储用户)

jqueryValidator自定义校验规则的一种方式(不覆盖源码)

覆盖现有的 Spring Security 身份验证

vue + element 实现登录注册(自定义表单验证规则)

在AuthController中覆盖laravel的5.2身份验证方法