logo

身份验证

简介

Laravel Jetstream 自动为您的项目搭建登录、双因素登录、注册、密码重置和电子邮件验证功能,让您专注于构建您关心的功能,而不是担心用户身份验证的细节。

Screenshot of Authentication

Laravel Fortify

在幕后,Jetstream 的身份验证部分由 Laravel Fortify 提供支持,它是一个与前端无关的 Laravel 身份验证后端。本质上,Fortify 定义了用于实现应用程序身份验证功能的路由和控制器,而 Jetstream UI 则向这些路由发出请求。

安装 Jetstream 后,config/fortify.php 配置文件将被安装到您的应用程序中。在这个配置文件中,您可以自定义 Fortify 行为的各个方面,例如要使用的身份验证守卫、身份验证后用户应重定向到的位置等等。

fortify 配置文件中,您还可以禁用 Fortify 的整个功能,例如更新个人资料信息或密码的功能。

视图/页面

使用 Livewire 堆栈时,登录视图使用 resources/views/auth/login.blade.php Blade 模板显示。使用 Inertia 堆栈时,此视图使用 resources/js/Pages/Auth/Login.vue 模板显示。包含这些视图的目录还包含应用程序的其他与身份验证相关的视图/页面。

自定义身份验证视图

Laravel Jetstream 将自动为您的应用程序的登录和其他身份验证屏幕呈现适当的视图。但是,有时您可能希望自定义特定身份验证视图的呈现方式或视图接收到的数据。

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

php
use Laravel\Fortify\Fortify;

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

自定义 Inertia 身份验证视图

如果您的应用程序使用 Inertia 堆栈,您可以从视图自定义闭包中返回 Inertia 页面。

php
use Illuminate\Support\Facades\Route;
use Inertia\Inertia;
use Laravel\Fortify\Fortify;

Fortify::loginView(function () {
    return Inertia::render('Auth/Login', [
        'canResetPassword' => Route::has('password.request'),
        'status' => session('status'),
    ]);
});

自定义身份验证过程

自定义用户身份验证

有时,您可能希望完全自定义用户凭据如何进行身份验证以及如何从应用程序数据库中检索用户。值得庆幸的是,Jetstream 允许您使用 Fortify::authenticateUsing 方法轻松实现这一点。

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

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;
        }
    });
}

如果您希望将自定义身份验证过程封装在类中而不是闭包中,您可以将 PHP “可调用” 数组传递给 authenticateUsing 方法。

php
use App\Actions\AuthenticateLoginAttempt;
use Laravel\Fortify\Fortify;

Fortify::authenticateUsing([new AuthenticateLoginAttempt, '__invoke']);

自定义身份验证管道

Laravel Fortify(Jetstream 的底层身份验证库)通过可调用类的管道对登录请求进行身份验证。

如果您愿意,您可以定义一个自定义的类管道,登录请求应该通过该管道进行传递。每个类都应该有一个 __invoke 方法,该方法接收传入的 Illuminate\Http\Request 实例,并且像中间件一样,一个 $next 变量,该变量被调用以将请求传递给管道中的下一个类。

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

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

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

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

密码重置

除了搭建与登录/身份验证相关的视图和操作外,Jetstream 还搭建了用户在忘记密码时重置密码所需的资源。当然,此功能利用了 Laravel 的底层 密码重置功能

Laravel 邮件

在使用密码重置功能之前,您应该确保您的 Laravel 应用程序已配置为 发送电子邮件。否则,Laravel 将无法向您的应用程序用户发送密码重置链接。

操作

与大多数 Jetstream 功能一样,满足密码重置请求所执行的逻辑可以在应用程序中的操作类中找到。请记住,操作是细粒度的类,负责执行与 Jetstream 或 Fortify 功能相关的单个任务。

具体来说,当用户重置密码时,将调用 App\Actions\Fortify\ResetUserPassword 类。此操作负责验证用户的新的密码并在用户实例上更新密码。因此,您希望对用户密码重置逻辑进行的任何自定义都应在此类中进行。该操作接收一个包含来自传入请求的所有输入的 $input 数组。

密码验证规则

App\Actions\Fortify\CreateNewUserApp\Actions\Fortify\ResetUserPasswordApp\Actions\Fortify\UpdateUserPassword 操作都使用 App\Actions\Fortify\PasswordValidationRules 特性。

您可能已经注意到,App\Actions\Fortify\PasswordValidationRules 特性使用自定义的 Laravel\Fortify\Rules\Password 验证规则对象。此对象允许您轻松地自定义应用程序的密码要求。默认情况下,该规则要求密码至少为八个字符。但是,您可以使用以下方法自定义密码的要求

php
use Laravel\Fortify\Rules\Password;

// Require at least 10 characters...
(new Password)->length(10)

// Require at least one uppercase character...
(new Password)->requireUppercase()

// Require at least one numeric character...
(new Password)->requireNumeric()

// Require at least one special character...
(new Password)->requireSpecialCharacter()

当然,这些方法可以链接起来以定义应用程序的密码验证规则

php
(new Password)->length(10)->requireSpecialCharacter()

视图/页面

Jetstream 的密码重置功能使用两个屏幕实现:一个屏幕允许用户请求密码重置链接,另一个屏幕允许用户重置密码。

使用 Livewire 栈时,密码重置链接请求视图使用 resources/views/auth/forgot-password.blade.php Blade 模板显示。使用 Inertia 栈时,此视图使用 resources/js/Pages/Auth/ForgotPassword.vue 模板显示。

重置密码

使用 Livewire 栈时,密码重置视图使用 resources/views/auth/reset-password.blade.php Blade 模板显示。使用 Inertia 栈时,此视图使用 resources/js/Pages/Auth/ResetPassword.vue 模板显示。