添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

许多 Web 应用程序为其用户提供一种通过应用程序进行身份验证和“登录”的方式。在 Web 应用程序中实现此功能可能是一项复杂且具有潜在风险的工作。因此,Laravel 致力于为您提供快速、安全且轻松地实现身份验证所需的工具。

在其核心,Laravel 的身份验证工具由“守卫”和“提供器”组成。守卫定义了如何为每个请求验证用户身份。例如,Laravel 附带了一个 session 守卫,该守卫使用会话存储和 Cookie 来维护状态。

提供器定义了如何从持久存储中检索用户。Laravel 附带了使用 Eloquent 和数据库查询构建器检索用户的支持。但是,您可以根据应用程序的需要自由定义其他提供器。

您的应用程序的身份验证配置文件位于 config/auth.php 。此文件包含多个有据可查的选项,用于调整 Laravel 身份验证服务的行为。

想要快速入门?在新的 Laravel 应用程序中安装 Laravel 应用程序入门套件 。迁移数据库后,将浏览器导航到 /register 或分配给您的应用程序的任何其他 URL。入门套件将负责搭建您的整个身份验证系统!

即使您选择不在最终的 Laravel 应用程序中使用入门套件,安装 入门套件 也可以成为学习如何在实际 Laravel 项目中实现 Laravel 的所有身份验证功能的绝佳机会。 由于 Laravel 入门套件包含身份验证控制器、路由和视图,您可以检查这些文件中的代码,以了解如何实现 Laravel 的身份验证功能。

数据库注意事项

默认情况下,Laravel 在您的 app/Models 目录中包含一个 App\Models\User Eloquent 模型 。此模型可以与默认的 Eloquent 身份验证驱动程序一起使用。

如果您的应用程序未使用 Eloquent,则可以使用 database 身份验证提供器,该提供器使用 Laravel 查询构建器。如果您的应用程序正在使用 MongoDB,请查看 MongoDB 的官方 Laravel 用户身份验证文档

在为 App\Models\User 模型构建数据库架构时,请确保密码列的长度至少为 60 个字符。当然,新的 Laravel 应用程序中包含的 users 表迁移已经创建了一个超过此长度的列。

此外,您应该验证您的 users (或等效)表是否包含一个可为空的、100 个字符的字符串 remember_token 列。此列将用于存储用户在登录应用程序时选择“记住我”选项的令牌。同样,新的 Laravel 应用程序中包含的默认 users 表迁移已经包含此列。

生态系统概述

Laravel 提供了几个与身份验证相关的软件包。在继续之前,我们将回顾 Laravel 中的通用身份验证生态系统,并讨论每个软件包的预期用途。

首先,考虑身份验证的工作原理。当使用 Web 浏览器时,用户将通过登录表单提供其用户名和密码。如果这些凭据正确,应用程序会将有关已身份验证用户的信息存储在用户的 会话 中。颁发给浏览器的 Cookie 包含会话 ID,以便后续对应用程序的请求可以将用户与正确的会话关联起来。收到会话 Cookie 后,应用程序将根据会话 ID 检索会话数据,注意到身份验证信息已存储在会话中,并将用户视为“已身份验证”。

当远程服务需要进行身份验证才能访问 API 时,Cookie 通常不用于身份验证,因为没有 Web 浏览器。相反,远程服务在每个请求上将 API 令牌发送到 API。应用程序可以根据有效 API 令牌表验证传入的令牌,并将请求“身份验证”为由与该 API 令牌关联的用户执行。

Laravel 的内置浏览器身份验证服务

Laravel 包括内置的身份验证和会话服务,这些服务通常通过 Auth Session 外观访问。这些功能为从 Web 浏览器发起的请求提供基于 Cookie 的身份验证。它们提供了一些方法,使您可以验证用户的凭据并验证用户的身份。此外,这些服务将自动将正确的身份验证数据存储在用户的会话中,并颁发用户的会话 Cookie。本文档包含有关如何使用这些服务的讨论。

应用程序入门套件

如本文档中所述,您可以手动与这些身份验证服务进行交互,以构建应用程序自己的身份验证层。但是,为了帮助您更快地入门,我们发布了 免费入门套件 ,这些套件提供了整个身份验证层的强大而现代的脚手架。

Laravel 的 API 身份验证服务

Laravel 提供了两个可选软件包,以帮助您管理 API 令牌并验证使用 API 令牌发出的请求: Passport Sanctum 。请注意,这些库和 Laravel 的内置基于 Cookie 的身份验证库并非互斥。这些库主要关注 API 令牌身份验证,而内置身份验证服务则关注基于 Cookie 的浏览器身份验证。许多应用程序将同时使用 Laravel 的内置基于 Cookie 的身份验证服务和 Laravel 的 API 身份验证软件包之一。

Passport

Passport 是一个 OAuth2 身份验证提供程序,提供各种 OAuth2“授权类型”,使您可以颁发各种类型的令牌。总的来说,这是一个强大而复杂的 API 身份验证软件包。但是,大多数应用程序不需要 OAuth2 规范提供的复杂功能,这可能会让用户和开发人员感到困惑。此外,开发人员历来对如何使用 OAuth2 身份验证提供程序(如 Passport)验证 SPA 应用程序或移动应用程序的身份感到困惑。

Sanctum

为了响应 OAuth2 的复杂性和开发人员的困惑,我们着手构建一个更简单、更精简的身份验证软件包,该软件包可以处理来自 Web 浏览器的第一方 Web 请求和通过令牌进行的 API 请求。通过 Laravel Sanctum 的发布实现了这一目标,对于将提供第一方 Web UI 以及 API 的应用程序,或者将由与后端 Laravel 应用程序分离的单页应用程序 (SPA) 提供支持的应用程序,或者提供移动客户端的应用程序,应将其视为首选和推荐的身份验证软件包。

Laravel Sanctum 是一个混合 Web/API 身份验证软件包,可以管理应用程序的整个身份验证过程。这是可能的,因为当基于 Sanctum 的应用程序收到请求时,Sanctum 将首先确定请求是否包含引用已身份验证会话的会话 Cookie。Sanctum 通过调用我们之前讨论过的 Laravel 的内置身份验证服务来实现这一点。如果请求未通过会话 Cookie 进行身份验证,Sanctum 将检查请求中是否存在 API 令牌。如果存在 API 令牌,Sanctum 将使用该令牌对请求进行身份验证。要了解有关此过程的更多信息,请查阅 Sanctum 的 “工作原理” 文档。

总结和选择您的堆栈

总而言之,如果您的应用程序将使用浏览器访问,并且您正在构建一个单体 Laravel 应用程序,则您的应用程序将使用 Laravel 的内置身份验证服务。

接下来,如果您的应用程序提供将由第三方使用的 API,您将在 Passport Sanctum 之间进行选择,以为您的应用程序提供 API 令牌身份验证。通常,在可能的情况下应首选 Sanctum,因为它是一个简单、完整的解决方案,适用于 API 身份验证、SPA 身份验证和移动身份验证,包括对“作用域”或“能力”的支持。

如果您正在构建将由 Laravel 后端提供支持的单页应用程序 (SPA),则应使用 Laravel Sanctum 。使用 Sanctum 时,您要么需要 手动实现您自己的后端身份验证路由 ,要么使用 Laravel Fortify 作为无头身份验证后端服务,该服务为注册、密码重置、邮箱验证等功能提供路由和控制器。

当您的应用程序绝对需要 OAuth2 规范提供的所有功能时,可以选择 Passport。

而且,如果您想快速入门,我们很高兴推荐 我们的应用程序入门套件 ,作为快速启动新的 Laravel 应用程序的一种方式,该应用程序已经使用了我们首选的 Laravel 内置身份验证服务身份验证堆栈。

身份验证快速入门

本文档的这一部分讨论了通过 Laravel 应用程序入门套件 验证用户身份,其中包括 UI 脚手架,以帮助您快速入门。如果您想直接与 Laravel 的身份验证系统集成,请查看有关 手动验证用户身份 的文档。

安装入门套件

首先,您应该 安装 Laravel 应用程序入门套件 。我们的入门套件为将身份验证合并到您的新 Laravel 应用程序中提供了设计精美的起点。

检索已身份验证的用户

从入门套件创建应用程序并允许用户注册和通过您的应用程序进行身份验证后,您通常需要与当前已身份验证的用户进行交互。在处理传入请求时,您可以通过 Auth 外观的 user 方法访问已身份验证的用户

1use Illuminate\Support\Facades\Auth;
2 
3// Retrieve the currently authenticated user...
4$user = Auth::user();
5 
6// Retrieve the currently authenticated user's ID...
7$id = Auth::id();

或者,一旦用户通过身份验证,您可以通过 Illuminate\Http\Request 实例访问已身份验证的用户。请记住,类型提示类将自动注入到您的控制器方法中。通过类型提示 Illuminate\Http\Request 对象,您可以方便地从应用程序中任何控制器方法通过请求的 user 方法访问已身份验证的用户

1<?php
2 
3namespace App\Http\Controllers;
4 
5use Illuminate\Http\RedirectResponse;
6use Illuminate\Http\Request;
7 
8class FlightController extends Controller
9{
10 /**
11 * Update the flight information for an existing flight.
12 */
13 public function update(Request $request): RedirectResponse
14 {
15 $user = $request->user();
16 
17 // ...
18 
19 return redirect('/flights');
20 }
21}