Skip to content
全部文档

Laravel Fortify ​

简介 ​

Laravel Fortify 是 Laravel 的前端无关身份验证后端实现。 Fortify 注册了实现 Laravel 所有身份验证功能所需的路由和控制器,包括登录、注册、密码重置、电子邮件验证等。安装Fortify后,您可以运行route:list Artisan命令来查看Fortify已注册的路由。

由于 Fortify 不提供自己的用户界面,因此它需要与您自己的用户界面配对,该用户界面向其注册的路由发出请求。我们将在本文档的其余部分中详细讨论如何向这些路由发出请求。

INFO

请记住,Fortify 是一个旨在让您在实现 Laravel 身份验证功能方面领先一步的软件包。 您不需要使用它。 您始终可以按照 authentication、password reset 和 email verification 文档中提供的文档手动与 Laravel 的身份验证服务进行交互。

什么是 Fortify? ​

如前所述,Laravel Fortify 是 Laravel 的前端不可知身份验证后端实现。 Fortify 注册了实现 Laravel 所有身份验证功能所需的路由和控制器,包括登录、注册、密码重置、电子邮件验证等。

您无需使用 Fortify 即可使用 Laravel 的身份验证功能。 您始终可以按照 authentication、password reset 和 email verification 文档中提供的文档手动与 Laravel 的身份验证服务进行交互。

如果您是 Laravel 新手,您可能希望探索 our application starter kits。 Laravel 的应用程序入门套件在内部使用 Fortify 为您的应用程序提供身份验证脚手架,其中包括使用 Tailwind CSS 构建的用户界面。这可以让您学习并熟悉 Laravel 的身份验证功能。

Laravel Fortify 本质上采用了我们的应用程序入门套件的路由和控制器,并将它们作为不包含用户界面的包提供。这使您仍然可以快速构建应用程序身份验证层的后端实现,而无需绑定到任何特定的前端意见。

我什么时候应该使用 Fortify? ​

您可能想知道什么时候适合使用 Laravel Fortify。首先,如果您使用 Laravel 的 application starter kits 之一,则不需要安装 Laravel Fortify,因为所有 Laravel 的应用程序入门工具包都使用 Fortify 并且已经提供了完整的身份验证实现。

如果您没有使用应用程序入门工具包并且您的应用程序需要身份验证功能,您有两种选择:手动实现应用程序的身份验证功能或使用 Laravel Fortify 提供这些功能的后端实现。

如果您选择安装 Fortify,您的用户界面将向本文档中详细介绍的 Fortify 身份验证路由发出请求,以便对用户进行身份验证和注册。

如果您选择手动与 Laravel 的身份验证服务交互而不是使用 Fortify,则可以按照 authentication、password reset 和 email verification 文档中提供的文档进行操作。

Laravel Fortify 和 Laravel Sanctum ​

一些开发人员对 Laravel Sanctum 和 Laravel Fortify 之间的区别感到困惑。由于这两个包解决了两个不同但相关的问题,Laravel Fortify 和 Laravel Sanctum 并不是相互排斥或竞争的包。

Laravel Sanctum 只关心管理 API 令牌并使用会话 cookie 或令牌对现有用户进行身份验证。 Sanctum不提供任何处理用户注册、密码重置等的路由。

如果您尝试为提供 API 或作为单页应用程序后端的应用程序手动构建身份验证层,您完全有可能同时使用 Laravel Fortify(用于用户注册、密码重置等)和 Laravel Sanctum(API 令牌管理、会话身份验证)。

安装 ​

首先,使用 Composer 包管理器安装 Fortify:

shell
composer require laravel/fortify

接下来,使用 fortify:install Artisan 命令发布 Fortify 的资源:

shell
php artisan fortify:install

此命令会将 Fortify 的操作发布到您的 app/Actions 目录,如果该目录不存在,则会创建该目录。此外,FortifyServiceProvider、配置文件和所有必要的数据库迁移都将被发布。

接下来,您应该迁移数据库:

shell
php artisan migrate

Fortify 功能 ​

fortify配置文件包含一个features配置数组。该数组定义 Fortify 默认情况下公开哪些后端路由/功能。我们建议您仅启用以下功能,这是大多数 Laravel 应用程序提供的基本身份验证功能:

php
'features' => [
    Features::registration(),
    Features::resetPasswords(),
    Features::emailVerification(),
],

禁用视图 ​

默认情况下,Fortify 定义旨在返回视图的路由,例如登录屏幕或注册屏幕。但是,如果您正在构建 JavaScript 驱动的单页应用程序,则可能不需要这些路由。因此,您可以通过将应用程序的 config/fortify.php 配置文件中的 views 配置值设置为 false 来完全禁用这些路由:

php
'views' => false,

禁用视图和密码重置 ​

如果您选择禁用 Fortify 的视图并且将为您的应用程序实现密码重置功能,您仍然应该定义一个名为 password.reset 的路由,负责显示应用程序的「重置密码」视图。这是必要的,因为 Laravel 的 Illuminate\Auth\Notifications\ResetPassword 通知将通过 password.reset 命名路由生成密码重置 URL。

身份验证 ​

首先,我们需要指示 Fortify 如何返回「登录」视图。请记住,Fortify 是一个无头身份验证库。如果您想要已为您完成的 Laravel 身份验证功能的前端实现,您应该使用 application starter kit。

所有身份验证视图的呈现逻辑都可以使用通过 Laravel\Fortify\Fortify 类提供的适当方法进行自定义。通常,您应该从应用程序的 App\Providers\FortifyServiceProvider 类的 boot 方法调用此方法。 Fortify 将负责定义返回此视图的 /login 路由:

php
use Laravel\Fortify\Fortify;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::loginView(function () {
        return view('auth.login');
    });

    // ...
}

您的登录模板应包含一个向 /login 发出 POST 请求的表单。 /login端点需要一个字符串email / username和一个password。电子邮件/用户名字段的名称应与 config/fortify.php 配置文件中的 username 值匹配。此外,可以提供布尔值 remember 字段来指示用户想要使用 Laravel 提供的「记住我」功能。

如果登录尝试成功,Fortify 会将您重定向到通过应用程序的 fortify 配置文件中的 home 配置选项配置的 URI。如果登录请求是 XHR 请求,将返回 200 HTTP 响应。

如果请求不成功,用户将被重定向回登录屏幕,并且验证错误将通过共享的 $errors Blade template variable 提供给您。或者,对于 XHR 请求,验证错误将随 422 HTTP 响应一起返回。

自定义用户身份验证 ​

Fortify 将根据提供的凭据和为您的应用程序配置的身份验证防护自动检索和验证用户。但是,您有时可能希望对登录凭据的身份验证方式和用户的检索方式进行完全自定义。值得庆幸的是,Fortify 允许您使用 Fortify::authenticateUsing 方法轻松完成此任务。

该方法接受一个接收传入 HTTP 请求的闭包。该闭包负责验证附加到请求的登录凭据并返回关联的用户实例。如果凭据无效或找不到用户,则闭包应返回null或false。通常,应该从 FortifyServiceProvider 的 boot 方法调用此方法:

php
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Laravel\Fortify\Fortify;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::authenticateUsing(function (Request $request) {
        $user = User::where('email', $request->email)->first();

        if ($user &&
            Hash::check($request->password, $user->password)) {
            return $user;
        }
    });

    // ...
}

认证卫士 ​

您可以在应用程序的 fortify 配置文件中自定义 Fortify 使用的身份验证防护。但是,您应该确保配置的防护是Illuminate\Contracts\Auth\StatefulGuard的实现。如果您尝试使用 Laravel Fortify 来验证 SPA,则应该将 Laravel 的默认 web 防护与 Laravel Sanctum 结合使用。

自定义身份验证管道 ​

Laravel Fortify 通过可调用类的管道对登录请求进行身份验证。如果您愿意,您可以定义一个自定义的类管道,登录请求应通过该类进行管道传输。每个类都应该有一个 __invoke 方法,用于接收传入的 Illuminate\Http\Request 实例,并且与 middleware 一样,还有一个 $next 变量,调用该变量以便将请求传递给管道中的下一个类。

要定义自定义管道,您可以使用 Fortify::authenticateThrough 方法。此方法接受一个闭包,该闭包应返回类数组以通过管道传输登录请求。通常,应该从 App\Providers\FortifyServiceProvider 类的 boot 方法调用此方法。

下面的示例包含默认管道定义,您可以在进行自己的修改时将其用作起点:

php
use Laravel\Fortify\Actions\AttemptToAuthenticate;
use Laravel\Fortify\Actions\CanonicalizeUsername;
use Laravel\Fortify\Actions\EnsureLoginIsNotThrottled;
use Laravel\Fortify\Actions\PrepareAuthenticatedSession;
use Laravel\Fortify\Actions\RedirectIfTwoFactorAuthenticatable;
use Laravel\Fortify\Features;
use Laravel\Fortify\Fortify;
use Illuminate\Http\Request;

Fortify::authenticateThrough(function (Request $request) {
    return array_filter([
            config('fortify.limiters.login') ? null : EnsureLoginIsNotThrottled::class,
            config('fortify.lowercase_usernames') ? CanonicalizeUsername::class : null,
            Features::enabled(Features::twoFactorAuthentication()) ? RedirectIfTwoFactorAuthenticatable::class : null,
            AttemptToAuthenticate::class,
            PrepareAuthenticatedSession::class,
    ]);
});

身份验证限制 ​

默认情况下,Fortify 将使用 EnsureLoginIsNotThrottled 中间件限制身份验证尝试。该中间件会限制用户名和 IP 地址组合特有的尝试。

某些应用程序可能需要不同的方法来限制身份验证尝试,例如仅通过 IP 地址进行限制。因此,Fortify 允许您通过 fortify.limiters.login 配置选项指定自己的 rate limiter。当然,此配置选项位于应用程序的 config/fortify.php 配置文件中。

INFO

结合使用限制、two-factor authentication和外部 Web 应用程序防火墙 (WAF) 将为您的合法应用程序用户提供最强大的防御。

自定义重定向 ​

如果登录尝试成功,Fortify 会将您重定向到通过应用程序的 fortify 配置文件中的 home 配置选项配置的 URI。如果登录请求是 XHR 请求,将返回 200 HTTP 响应。用户注销应用程序后,用户将被重定向到 / URI。

如果您需要对此行为进行高级自定义,您可以将 LoginResponse 和 LogoutResponse 合约的实现绑定到 Laravel service container 中。通常,这应该在应用程序的 App\Providers\FortifyServiceProvider 类的 register 方法中完成:

php
use Laravel\Fortify\Contracts\LogoutResponse;

/**
 * Register any application services.
 */
public function register(): void
{
    $this->app->instance(LogoutResponse::class, new class implements LogoutResponse {
        public function toResponse($request)
        {
            return redirect('/');
        }
    });
}

双因素认证 ​

当启用 Fortify 的双因素身份验证功能时,用户需要在身份验证过程中输入六位数字令牌。此令牌是使用基于时间的一次性密码 (TOTP) 生成的,可以从任何 TOTP 兼容的移动身份验证应用程序(例如 Google Authenticator)检索该密码。

在开始之前,您应该首先确保应用程序的 App\Models\User 模型使用 Laravel\Fortify\TwoFactorAuthenticatable 特征:

php
<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Fortify\TwoFactorAuthenticatable;

class User extends Authenticatable
{
    use Notifiable, TwoFactorAuthenticatable;
}

接下来,您应该在应用程序中构建一个屏幕,用户可以在其中管理其双因素身份验证设置。此屏幕应允许用户启用和禁用双因素身份验证,以及重新生成其双因素身份验证恢复代码。

默认情况下,fortify 配置文件的 features 数组指示 Fortify 的双因素身份验证设置在修改之前需要密码确认。因此,您的应用程序应该在继续之前实现 Fortify 的 password confirmation 功能。

启用双因素身份验证 ​

要开始启用双因素身份验证,您的应用程序应向 Fortify 定义的 /user/two-factor-authentication 端点发出 POST 请求。如果请求成功,用户将被重定向回之前的 URL,并且 status 会话变量将设置为 two-factor-authentication-enabled。您可以在模板中检测此 status 会话变量以显示相应的成功消息。如果请求是 XHR 请求,将返回 200 HTTP 响应。

选择启用二因素身份验证后,用户仍必须通过提供有效的二因素身份验证代码来「确认」其二因素身份验证配置。因此,您的「成功」消息应该指示用户仍然需要两步身份验证确认:

html
@if (session('status') == 'two-factor-authentication-enabled')
    <div class="mb-4 font-medium text-sm">
        Please finish configuring two-factor authentication below.
    </div>
@endif

接下来,您应该显示双因素身份验证二维码,供用户扫描到其身份验证器应用程序。如果您使用 Blade 渲染应用程序的前端,您可以使用用户实例上可用的 twoFactorQrCodeSvg 方法检索 QR 代码 SVG:

php
$request->user()->twoFactorQrCodeSvg();

如果您正在构建 JavaScript 支持的前端,您可以向 /user/two-factor-qr-code 端点发出 XHR GET 请求,以检索用户的双因素身份验证二维码。该端点将返回一个包含 svg 键的 JSON 对象。

确认双因素身份验证 ​

除了显示用户的双因素身份验证二维码之外,您还应该提供一个文本输入,用户可以在其中提供有效的身份验证代码来「确认」其双因素身份验证配置。此代码应通过对 Fortify 定义的 /user/confirmed-two-factor-authentication 端点的 POST 请求提供给 Laravel 应用程序。

如果请求成功,用户将被重定向回之前的 URL,并且 status 会话变量将被设置为 two-factor-authentication-confirmed:

html
@if (session('status') == 'two-factor-authentication-confirmed')
    <div class="mb-4 font-medium text-sm">
        Two-factor authentication confirmed and enabled successfully.
    </div>
@endif

如果通过 XHR 请求向双因素身份验证确认端点发出请求,则将返回 200 HTTP 响应。

显示恢复代码 ​

您还应该显示用户的两因素恢复代码。这些恢复代码允许用户在无法访问其移动设备时进行身份验证。如果您使用 Blade 渲染应用程序的前端,您可以通过经过身份验证的用户实例访问恢复代码:

php
(array) $request->user()->recoveryCodes()

如果您正在构建 JavaScript 支持的前端,您可以向 /user/two-factor-recovery-codes 端点发出 XHR GET 请求。该端点将返回一个包含用户恢复代码的 JSON 数组。

要重新生成用户的恢复代码,您的应用程序应向 /user/two-factor-recovery-codes 端点发出 POST 请求。

使用双因素身份验证进行身份验证 ​

在身份验证过程中,Fortify 会自动将用户重定向到应用程序的两因素身份验证质询屏幕。但是,如果您的应用程序发出 XHR 登录请求,则在成功进行身份验证尝试后返回的 JSON 响应将包含具有 two_factor 布尔属性的 JSON 对象。您应该检查此值以了解是否应该重定向到应用程序的两因素身份验证质询屏幕。

要开始实现二因素身份验证功能,我们需要指示 Fortify 如何返回二因素身份验证质询视图。 Fortify 的所有身份验证视图呈现逻辑都可以使用通过 Laravel\Fortify\Fortify 类提供的适当方法进行自定义。通常,您应该从应用程序的 App\Providers\FortifyServiceProvider 类的 boot 方法调用此方法:

php
use Laravel\Fortify\Fortify;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::twoFactorChallengeView(function () {
        return view('auth.two-factor-challenge');
    });

    // ...
}

Fortify 将负责定义返回此视图的 /two-factor-challenge 路由。您的 two-factor-challenge 模板应包含一个向 /two-factor-challenge 端点发出 POST 请求的表单。 /two-factor-challenge 操作需要包含有效 TOTP 令牌的 code 字段或包含用户恢复代码之一的 recovery_code 字段。

如果登录尝试成功,Fortify 会将用户重定向到通过应用程序的 fortify 配置文件中的 home 配置选项配置的 URI。如果登录请求是 XHR 请求,将返回 204 HTTP 响应。

如果请求不成功,用户将被重定向回两因素质询屏幕,并且验证错误将通过共享的 $errors Blade template variable 提供给您。或者,对于 XHR 请求,验证错误将通过 422 HTTP 响应返回。

禁用双因素身份验证 ​

要禁用双因素身份验证,您的应用程序应向 /user/two-factor-authentication 端点发出 DELETE 请求。请记住,Fortify 的双因素身份验证端点在被调用之前需要 password confirmation。

注册 ​

要开始实现应用程序的注册功能,我们需要指示 Fortify 如何返回「注册」视图。请记住,Fortify 是一个无头身份验证库。如果您想要已为您完成的 Laravel 身份验证功能的前端实现,您应该使用 application starter kit。

Fortify 的所有视图渲染逻辑都可以使用通过 Laravel\Fortify\Fortify 类提供的适当方法进行自定义。通常,您应该从 App\Providers\FortifyServiceProvider 类的 boot 方法调用此方法:

php
use Laravel\Fortify\Fortify;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::registerView(function () {
        return view('auth.register');
    });

    // ...
}

Fortify 将负责定义返回此视图的 /register 路由。您的 register 模板应包含一个表单,该表单向 Fortify 定义的 /register 端点发出 POST 请求。

/register端点需要一个字符串name、字符串电子邮件地址/用户名、password和password_confirmation字段。电子邮件/用户名字段的名称应与应用程序的 fortify 配置文件中定义的 username 配置值匹配。

如果注册尝试成功,Fortify 会将用户重定向到通过应用程序的 fortify 配置文件中的 home 配置选项配置的 URI。如果请求是 XHR 请求,将返回 201 HTTP 响应。

如果请求不成功,用户将被重定向回注册屏幕,并且验证错误将通过共享的 $errors Blade template variable 提供给您。或者,对于 XHR 请求,验证错误将通过 422 HTTP 响应返回。

定制注册 ​

用户验证和创建过程可以通过修改安装 Laravel Fortify 时生成的 App\Actions\Fortify\CreateNewUser 操作来自定义。

密码重置 ​

请求密码重置链接 ​

要开始实现应用程序的密码重置功能,我们需要指示 Fortify 如何返回「忘记密码」视图。请记住,Fortify 是一个无头身份验证库。如果您想要已为您完成的 Laravel 身份验证功能的前端实现,您应该使用 application starter kit。

Fortify 的所有视图渲染逻辑都可以使用通过 Laravel\Fortify\Fortify 类提供的适当方法进行自定义。通常,您应该从应用程序的 App\Providers\FortifyServiceProvider 类的 boot 方法调用此方法:

php
use Laravel\Fortify\Fortify;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::requestPasswordResetLinkView(function () {
        return view('auth.forgot-password');
    });

    // ...
}

Fortify 将负责定义返回此视图的 /forgot-password 端点。您的 forgot-password 模板应包含一个向 /forgot-password 端点发出 POST 请求的表单。

/forgot-password端点需要一个字符串email字段。此字段/数据库列的名称应与应用程序的 fortify 配置文件中的 email 配置值匹配。

处理密码重置链接请求响应 ​

如果密码重置链接请求成功,Fortify 会将用户重定向回 /forgot-password 端点,并向用户发送一封电子邮件,其中包含可用于重置密码的安全链接。如果请求是 XHR 请求,将返回 200 HTTP 响应。

请求成功后重定向回 /forgot-password 端点后,status 会话变量可用于显示密码重置链接请求尝试的状态。

$status 会话变量的值将与应用程序的 passwords language file 中定义的翻译字符串之一匹配。如果你想自定义这个值并且还没有发布 Laravel 的语言文件,你可以通过 lang:publish Artisan 命令来实现:

html
@if (session('status'))
    <div class="mb-4 font-medium text-sm text-green-600">
        {{ session('status') }}
    </div>
@endif

如果请求不成功,用户将被重定向回请求密码重置链接屏幕,并且验证错误将通过共享的 $errors Blade template variable 提供给您。或者,对于 XHR 请求,验证错误将通过 422 HTTP 响应返回。

重置密码 ​

为了完成应用程序的密码重置功能的实现,我们需要指示 Fortify 如何返回「重置密码」视图。

Fortify 的所有视图渲染逻辑都可以使用通过 Laravel\Fortify\Fortify 类提供的适当方法进行自定义。通常,您应该从应用程序的 App\Providers\FortifyServiceProvider 类的 boot 方法调用此方法:

php
use Laravel\Fortify\Fortify;
use Illuminate\Http\Request;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::resetPasswordView(function (Request $request) {
        return view('auth.reset-password', ['request' => $request]);
    });

    // ...
}

Fortify 将负责定义显示此视图的路线。您的 reset-password 模板应包含一个向 /reset-password 发出 POST 请求的表单。

/reset-password端点需要一个字符串email字段、一个password字段、一个password_confirmation字段和一个名为token的隐藏字段,其中包含request()->route('token')的值。 「电子邮件」字段/数据库列的名称应与应用程序的 fortify 配置文件中定义的 email 配置值匹配。

处理密码重置响应 ​

如果密码重置请求成功,Fortify 将重定向回 /login 路由,以便用户可以使用新密码登录。此外,还将设置一个 status 会话变量,以便您可以在登录屏幕上显示重置的成功状态:

blade
@if (session('status'))
    <div class="mb-4 font-medium text-sm text-green-600">
        {{ session('status') }}
    </div>
@endif

如果请求是 XHR 请求,将返回 200 HTTP 响应。

如果请求不成功,用户将被重定向回重置密码屏幕,并且验证错误将通过共享的 $errors Blade template variable 提供给您。或者,对于 XHR 请求,验证错误将通过 422 HTTP 响应返回。

自定义密码重置 ​

可以通过修改安装 Laravel Fortify 时生成的 App\Actions\ResetUserPassword 操作来自定义密码重置过程。

邮箱验证 ​

注册后,您可能希望用户在继续访问您的应用程序之前验证他们的电子邮件地址。首先,请确保在 fortify 配置文件的 features 数组中启用 emailVerification 功能。接下来,您应该确保您的 App\Models\User 类实现 Illuminate\Contracts\Auth\MustVerifyEmail 接口。

完成这两个设置步骤后,新注册用户将收到一封电子邮件,提示他们验证其电子邮件地址所有权。但是,我们需要告知 Fortify 如何显示电子邮件验证屏幕,通知用户需要单击电子邮件中的验证链接。

Fortify 的所有视图渲染逻辑都可以使用通过 Laravel\Fortify\Fortify 类提供的适当方法进行自定义。通常,您应该从应用程序的 App\Providers\FortifyServiceProvider 类的 boot 方法调用此方法:

php
use Laravel\Fortify\Fortify;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::verifyEmailView(function () {
        return view('auth.verify-email');
    });

    // ...
}

当用户通过 Laravel 内置的 verified 中间件重定向到 /email/verify 端点时,Fortify 将负责定义显示此视图的路由。

您的 verify-email 模板应包含一条信息消息,指示用户单击发送到其电子邮件地址的电子邮件验证链接。

重新发送电子邮件验证链接 ​

如果您愿意,您可以向应用程序的 verify-email 模板添加一个按钮,以触发对 /email/verification-notification 端点的 POST 请求。当该端点收到请求时,新的验证电子邮件链接将通过电子邮件发送给用户,以便用户在前一个验证链接被意外删除或丢失时获得新的验证链接。

如果重新发送验证链接电子邮件的请求成功,Fortify 将使用 status 会话变量将用户重定向回 /email/verify 端点,允许您向用户显示一条信息性消息,通知他们操作已成功。如果请求是 XHR 请求,将返回 202 HTTP 响应:

blade
@if (session('status') == 'verification-link-sent')
    <div class="mb-4 font-medium text-sm text-green-600">
        A new email verification link has been emailed to you!
    </div>
@endif

保护路由 ​

要指定一个或一组路由要求用户验证其电子邮件地址,您应该将 Laravel 的内置 verified 中间件附加到该路由。 verified 中间件别名由 Laravel 自动注册,并用作 Illuminate\Auth\Middleware\EnsureEmailIsVerified 中间件的别名:

php
Route::get('/dashboard', function () {
    // ...
})->middleware(['verified']);

密码确认 ​

在构建应用程序时,您有时可能会执行一些需要用户在执行操作之前确认其密码的操作。通常,这些路由受到 Laravel 内置 password.confirm 中间件的保护。

要开始实现密码确认功能,我们需要指示 Fortify 如何返回应用程序的「密码确认」视图。请记住,Fortify 是一个无头身份验证库。如果您想要已为您完成的 Laravel 身份验证功能的前端实现,您应该使用 application starter kit。

Fortify 的所有视图渲染逻辑都可以使用通过 Laravel\Fortify\Fortify 类提供的适当方法进行自定义。通常,您应该从应用程序的 App\Providers\FortifyServiceProvider 类的 boot 方法调用此方法:

php
use Laravel\Fortify\Fortify;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::confirmPasswordView(function () {
        return view('auth.confirm-password');
    });

    // ...
}

Fortify 将负责定义返回此视图的 /user/confirm-password 端点。您的 confirm-password 模板应包含一个向 /user/confirm-password 端点发出 POST 请求的表单。 /user/confirm-password 端点需要一个包含用户当前密码的 password 字段。

如果密码与用户的当前密码匹配,Fortify 会将用户重定向到他们尝试访问的路由。如果请求是 XHR 请求,将返回 201 HTTP 响应。

如果请求不成功,用户将被重定向回确认密码屏幕,并且验证错误将通过共享的 $errors Blade 模板变量提供给您。或者,对于 XHR 请求,验证错误将通过 422 HTTP 响应返回。