Skip to content
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待

Laravel Fortify ​

介绍 ​

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

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

注意

请记住,Fortify 是一个旨在帮助您快速实现 Laravel 认证功能的包。您并不需要使用它。 您始终可以通过遵循 认证、密码重置 和 电子邮件验证 文档中的说明手动与 Laravel 的认证服务进行交互。

什么是 Fortify? ​

如前所述,Laravel Fortify 是一个与前端无关的 Laravel 认证后端实现。Fortify 注册了实现 Laravel 所有认证功能所需的路由和控制器,包括登录、注册、密码重置、电子邮件验证等。

您并不需要使用 Fortify 来使用 Laravel 的认证功能。 您始终可以通过遵循 认证、密码重置 和 电子邮件验证 文档中的说明手动与 Laravel 的认证服务进行交互。

如果您是 Laravel 的新手,不妨探索一下我们的应用入门套件。Laravel 的应用入门套件在内部使用 Fortify,为您的应用程序提供认证脚手架,其中包含使用 Tailwind CSS 构建的用户界面。这使您可以深入学习和熟悉 Laravel 的认证功能。

Laravel Fortify 本质上是将我们的应用程序入门套件的路由和控制器作为一个不包含用户界面的包提供。这使您仍然可以快速搭建应用程序认证层的后端实现,而不必依赖任何特定的前端意见。

什么时候应该使用 Fortify? ​

您可能想知道何时适合使用 Laravel Fortify。首先,如果您正在使用 Laravel 的任一应用入门套件,则无需安装 Laravel Fortify,因为所有 Laravel 应用入门套件都已使用 Fortify 并提供了完整的认证实现。

如果您没有使用应用程序入门套件,并且您的应用程序需要认证功能,您有两个选择:手动实现应用程序的认证功能,或使用 Laravel Fortify 提供这些功能的后端实现。

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

如果您选择手动与 Laravel 的认证服务交互而不是使用 Fortify,您可以通过遵循 认证、密码重置 和 电子邮件验证 文档中的说明来实现。

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 认证功能的前端实现,您应该使用 应用程序入门套件。

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

php
use Laravel\Fortify\Fortify;

/**
 * 启动任何应用程序服务。
 */
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 模板变量 提供给您。或者,在 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;

/**
 * 启动任何应用程序服务。
 */
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 实例,并像 中间件 一样,具有一个 $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 允许您通过应用程序的 config/fortify.php 配置文件中的 fortify.limiters.login 配置选项指定自己的 速率限制器。

注意

使用限流、双因素认证 和外部 Web 应用程序防火墙 (WAF) 的组合将为您的合法应用程序用户提供最强大的防御。

自定义重定向 ​

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

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

php
use Laravel\Fortify\Contracts\LogoutResponse;

/**
 * 注册任何应用程序服务。
 */
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 trait:

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 的 密码确认 功能。

启用双因素认证 ​

要开始启用双因素认证,您的应用程序应向 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">
        请在下方完成双因素认证配置。
    </div>
@endif

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

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

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

确认双因素认证 ​

除了显示用户的双因素认证二维码,您还应提供一个文本输入框,用户可以在其中提供有效的认证代码以“确认”他们的双因素认证配置。此代码应通过 POST 请求提供给 Laravel 应用程序,发送到 Fortify 定义的 /user/confirmed-two-factor-authentication 端点。

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

html
@if (session('status') == 'two-factor-authentication-confirmed')
    <div class="mb-4 font-medium text-sm">
        双因素认证已成功确认并启用。
    </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;

/**
 * 启动任何应用程序服务。
 */
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 模板变量 提供给您。或者,在 XHR 请求的情况下,验证错误将与 422 HTTP 响应一起返回。

禁用双因素认证 ​

要禁用双因素认证,您的应用程序应向 /user/two-factor-authentication 端点发出 DELETE 请求。请记住,Fortify 的双因素认证端点在调用前需要 密码确认。

注册 ​

要开始实现应用程序的注册功能,我们需要指示 Fortify 如何返回我们的“注册”视图。请记住,Fortify 是一个无头认证库。如果您希望获得已经为您完成的 Laravel 认证功能的前端实现,您应该使用 应用程序入门套件。

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

php
use Laravel\Fortify\Fortify;

/**
 * 启动任何应用程序服务。
 */
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 模板变量 提供给您。或者,在 XHR 请求的情况下,验证错误将与 422 HTTP 响应一起返回。

自定义注册 ​

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

密码重置 ​

请求密码重置链接 ​

要开始实现应用程序的密码重置功能,我们需要指示 Fortify 如何返回我们的“忘记密码”视图。请记住,Fortify 是一个无头认证库。如果您希望获得已经为您完成的 Laravel 认证功能的前端实现,您应该使用 应用程序入门套件。

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

php
use Laravel\Fortify\Fortify;

/**
 * 启动任何应用程序服务。
 */
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 语言文件 中定义的翻译字符串之一匹配。如果您希望自定义此值并且尚未发布 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 模板变量 提供给您。或者,在 XHR 请求的情况下,验证错误将与 422 HTTP 响应一起返回。

重置密码 ​

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

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

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

/**
 * 启动任何应用程序服务。
 */
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 模板变量 提供给您。或者,在 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;

/**
 * 启动任何应用程序服务。
 */
public function boot(): void
{
    Fortify::verifyEmailView(function () {
        return view('auth.verify-email');
    });

    // ...
}

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

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

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

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

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

blade
@if (session('status') == 'verification-link-sent')
    <div class="mb-4 font-medium text-sm text-green-600">
        已向您发送了一封新的电子邮件验证链接!
    </div>
@endif

保护路由 ​

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

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

密码确认 ​

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

要开始实现密码确认功能,我们需要指示 Fortify 如何返回应用程序的“密码确认”视图。请记住,Fortify 是一个无头认证库。如果您希望获得已经为您完成的 Laravel 认证功能的前端实现,您应该使用 应用程序入门套件。

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

php
use Laravel\Fortify\Fortify;

/**
 * 启动任何应用程序服务。
 */
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 响应一起返回。