跳转到主要内容

Laravel 认证系统的内部结构

Auth Facade 与 AuthManager

Auth Facade 是 Illuminate\Auth\AuthManager 的代理。AuthManager 采用驱动模式管理多个 Guard,根据 config/auth.php 的配置生成并缓存合适的 Guard 实例。
resolve()config/auth.phpguards 数组中读取 driver 键,并调用相应的工厂闭包。内置的 sessiontoken 驱动也是以同样的机制注册的。

Guard 接口与 StatefulGuard 接口的区别

Laravel 的认证 Guard 至少要实现 Illuminate\Contracts\Auth\Guard。如果需要维持 Session,则要实现 StatefulGuard
StatefulGuard 继承 Guard,并追加了使用 Session 或 Cookie 保持登录状态所需的方法。
API 认证、自定义 Token 认证等无需 Session 的 Guard 只需实现 Guard 即可。像管理员登录这种需要 Session 的场景则需要实现 StatefulGuard

自定义 Guard 的实现

GuardHelpers trait

由于 Guard 接口中的 check()guest()id()hasUser() 几乎都是相同的实现,Laravel 提供了 Illuminate\Auth\GuardHelpers trait。使用该 trait 可以把必须实现的方法收敛为 user()validate() 两个。

API Token 认证 Guard 实现示例

参照 TokenGuard 的设计,实现一个简单的 API Token 认证 Guard。它从请求头或查询参数中获取 Token,通过 UserProvider 解析用户。
1

创建 Guard 类

app/Auth 目录下创建 Guard 类。
2

在 ServiceProvider 中注册 Guard

AppServiceProviderboot() 方法中通过 Auth::extend() 注册 Guard。
Auth::createUserProvider() 读取 config/auth.phpproviders 配置,返回对应的 UserProvider 实例。只要没有自定义 Provider,就可以按此方式使用标准的 EloquentUserProvider
3

在 config/auth.php 中配置 Guard

config/auth.php 中添加新的 Guard。
4

将 Guard 应用到路由

auth 中间件后指定 Guard 名称。
在 Controller 或代码中使用特定 Guard 时调用 Auth::guard('api')auth('api')

用闭包定义简易 Guard

使用 Auth::viaRequest() 可以不创建类,仅用闭包定义简单的 Guard。适合原型验证或极为简单的认证。
config/auth.php 中的配置:
使用 Auth::viaRequest() 定义的 Guard 不使用 UserProvider,因此 retrieveById() 等 Provider 方法不可用。生产环境建议使用基于 Auth::extend() 的类式 Guard。

自定义 UserProvider 的实现

若要从数据库以外的来源(外部 API、LDAP 等)获取用户信息,请实现 Illuminate\Contracts\Auth\UserProvider 接口。

注册自定义 UserProvider

config/auth.phpproviders 段追加:
将 Guard 与 Provider 组合:

实战用例

多重认证(管理员与普通用户使用不同 Guard)

1

创建 Admin 模型

准备用于管理员的 Eloquent 模型。通过继承 AuthenticatableAuth 系统集成。
2

配置 config/auth.php

3

配置路由与中间件

4

指定 Guard 编写登录处理

基于 JWT Token 的外部 API 认证

使用外部 JWT 认证服务时的自定义 Guard 实现示例。
AppServiceProvider 中注册:
可以像 Auth::guard('jwt')->payload() 这样访问自定义 Guard 特有的方法。Auth::guard() 返回的正是 Guard 实例本身,因此接口中未定义的方法也可以调用。

测试

在自定义 Guard 的单元测试中,通过 Mock UserProvider 来验证 Guard 的行为。
在使用 ActingAs 的功能测试中,可以为指定 Guard 设定用户。

相关页面

认证(入门)

了解 Starter Kit 及标准认证流程。

服务容器

理解 Guard 注册所依赖的服务容器机制。
最后修改于 2026年7月18日