环境说明
| 环境组件 | 版本 | 备注 |
|---|---|---|
| PigX | 5.9 | |
| JDK | 17 |
概述
本文详细介绍如何在 Spring Authorization Server 中实现自定义认证模式,以邮件验证码登录为例,展示完整的自定义认证流程实现。

背景与目标
在传统的 OAuth2 授权流程中,通常使用用户名密码进行身份验证。但在某些业务场景下,我们可能需要使用其他方式进行身份验证,比如:
- 邮件验证码登录
- 短信验证码登录
- 第三方平台登录
- 生物识别登录
本文将演示如何基于 Spring Authorization Server 实现邮件验证码登录的自定义认证模式,为其他自定义认证方式提供参考模板。
实现架构
自定义认证模式主要涉及以下核心组件:
- 认证令牌 (Authentication Token) - 定义自定义的认证令牌类型
- 认证转换器 (Authentication Converter) - 处理请求参数并转换为认证令牌
- 认证提供者 (Authentication Provider) - 执行实际的认证逻辑
- 用户详情服务 (User Details Service) - 根据认证信息加载用户详情
- 授权服务器配置 - 注册自定义认证模式
核心实现
1. 认证令牌 (Authentication Token)
首先定义自定义的认证令牌类,用于封装邮件登录的认证信息:
1 | /** |
关键点说明:
- 继承
OAuth2ResourceOwnerBaseAuthenticationToken基类 - 构造函数参数固定,无需自定义修改
- 主要用于标识这是一个邮件认证类型的令牌
2. 认证转换器 (Authentication Converter)
1 | public class OAuth2ResourceOwnerEmailAuthenticationConverter |
3. 认证提供者 (Authentication Provider)
1 | public class OAuth2ResourceOwnerEmailAuthenticationProvider |
授权服务器配置
注册邮件登录自定义授权方式
在 AuthorizationServerConfiguration 中注册自定义的邮件认证模式:

配置要点:
- 注册自定义的认证转换器
- 注册自定义的认证提供者
- 确保授权类型 “email” 被正确识别
资源服务配置
用户详情服务
PigxEmailUserDetailServiceImpl
Spring Security 回调业务的入口,负责根据邮件地址加载用户信息:
核心功能:
- 验证邮件验证码
- 根据邮件地址查询用户信息
- 构造用户详情对象
1 | @Slf4j |
SPI 文件注册
通过 SPI 机制注册自定义的 UserDetailService:

注册步骤:
- 在
META-INF/services目录下创建配置文件 - 指定自定义 UserDetailService 的实现类
- 确保 Spring 能够正确加载和实例化服务
认证提供者配置
配置 PigxDaoAuthenticationProvider 跳过密码校验:

配置说明:
- 针对邮件认证模式,跳过传统的密码验证
- 直接使用邮件地址进行用户身份验证
- 确保认证流程的完整性
测试使用
1. 数据库配置
首先在数据库中插入支持邮件认证的客户端配置:
1 | INSERT INTO `pigxx`.`sys_oauth_client_details` |
配置说明:
client_id: 客户端标识符authorized_grant_types: 授权类型设置为 “email”scope: 权限范围access_token_validity: 访问令牌有效期(秒)
2. API 测试
使用 curl 命令测试邮件认证接口:
1 | curl --location --request POST 'http://127.0.0.1:9999/auth/oauth2/token?grant_type=email&code=1234' \ |
请求参数说明:
grant_type=email: 指定使用邮件认证模式code=1234: 邮件验证码email=sw@pigx.vip: 用户邮件地址scope=server: 请求的权限范围Authorization: 客户端认证信息(Base64 编码)
预期响应:
1 | { |