Skip to main content

Laravel 认证系统的内部结构

Auth Facade 与 AuthManager

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

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

在 AppServiceProvider 的 boot() 方法中通过 Auth::extend() 注册 Guard。
Auth::createUserProvider() 读取 config/auth.php 的 providers 配置,返回对应的 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.php 的 providers 段追加:
将 Guard 与 Provider 组合:

实战用例

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

1

创建 Admin 模型

准备用于管理员的 Eloquent 模型。通过继承 Authenticatable 与 Auth 系统集成。
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日