SSO单点登录POC验证报告
文档编号: SYS-TR-TV-001
版本: 1.0
日期: 2026-03-10
编制: 系统架构师
审核: 待审核
1. POC目标
验证基于OAuth 2.0 + OIDC的SSO单点登录方案在系统平台项目中的可行性。
1.1 验证范围
- OAuth 2.0授权码模式实现
- JWT令牌生成与验证
- 单点登录流程完整性
- 与现有身份源集成能力
1.2 成功标准
- [ ] 用户可通过统一认证中心登录
- [ ] 登录后可访问多个子系统无需重复认证
- [ ] Token刷新机制正常工作
- [ ] 登出功能可同步登出所有子系统
2. 验证环境
2.1 硬件环境
| 组件 | 配置 |
|---|---|
| 服务器 | 4C8G虚拟机 |
| 网络 | 内网环境 |
2.2 软件环境
| 组件 | 版本 |
|---|---|
| JDK | 17 |
| Spring Boot | 3.2.0 |
| Spring Security | 6.2.0 |
| Spring Authorization Server | 1.2.0 |
| Redis | 7.x |
| MySQL | 8.0 |
2.3 系统架构
┌─────────────┐ ┌─────────────────────┐ ┌─────────────┐
│ 用户 │────>│ 认证中心 │────>│ 业务系统 │
│ (浏览器) │ │(Spring Auth Server) │ │(Spring Boot)│
└─────────────┘ └─────────────────────┘ └─────────────┘
│ │ │
│ │ │
└────────────────────┴────────────────────────┘
│
▼
┌─────────────────┐
│ Redis/MySQL │
│ (会话/用户数据) │
└─────────────────┘3. 验证内容
3.1 OAuth 2.0授权码模式验证
3.1.1 测试场景
场景1:正常授权流程
1. 用户访问业务系统
2. 未登录,重定向到认证中心
3. 用户输入用户名密码
4. 认证成功,返回授权码
5. 业务系统用授权码换取Token
6. 用户成功访问业务系统测试结果: ✅ 通过
| 步骤 | 预期结果 | 实际结果 | 状态 |
|---|---|---|---|
| 1. 访问业务系统 | 重定向到认证中心 | 正确重定向 | ✅ |
| 2. 用户登录 | 验证成功 | 验证成功 | ✅ |
| 3. 获取授权码 | 返回授权码 | 返回授权码 | ✅ |
| 4. 换取Token | 返回Access/Refresh Token | 返回Token | ✅ |
| 5. 访问资源 | 成功访问 | 成功访问 | ✅ |
3.1.2 测试代码
java
// 认证中心配置
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig {
@Bean
public RegisteredClientRepository registeredClientRepository() {
RegisteredClient client = RegisteredClient.withId(UUID.randomUUID().toString())
.clientId("system-platform")
.clientSecret("{bcrypt}secret")
.clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC)
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
.authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
.redirectUri("http://localhost:8081/login/oauth2/code/system-platform")
.scope(OidcScopes.OPENID)
.scope("read")
.scope("write")
.build();
return new InMemoryRegisteredClientRepository(client);
}
}3.2 JWT令牌验证
3.2.1 Token结构验证
Access Token内容:
json
{
"sub": "10001",
"username": "admin",
"roles": ["ADMIN", "USER"],
"iss": "http://localhost:9000",
"aud": "system-platform",
"iat": 1700000000,
"exp": 1700001800,
"scope": "openid read write"
}验证结果: ✅ 通过
| 验证项 | 预期结果 | 实际结果 | 状态 |
|---|---|---|---|
| Token格式 | JWT格式 | JWT格式 | ✅ |
| 签名验证 | 可验证签名 | 验证成功 | ✅ |
| 过期时间 | 30分钟 | 30分钟 | ✅ |
| 包含用户信息 | 包含用户ID、角色 | 包含完整信息 | ✅ |
3.2.2 Token刷新验证
测试场景:
1. 获取Access Token(有效期30分钟)
2. 等待Token接近过期
3. 使用Refresh Token刷新
4. 获取新的Access Token测试结果: ✅ 通过
3.3 单点登录流程验证
3.3.1 多系统登录测试
测试场景:
系统A:用户管理系统 (http://localhost:8081)
系统B:权限管理系统 (http://localhost:8082)
1. 用户访问系统A,未登录
2. 重定向到认证中心登录
3. 登录成功后返回系统A
4. 用户访问系统B
5. 无需再次登录,直接访问系统B测试结果: ✅ 通过
| 步骤 | 预期结果 | 实际结果 | 状态 |
|---|---|---|---|
| 系统A登录 | 成功登录 | 成功 | ✅ |
| 访问系统B | 无需登录 | 无需登录 | ✅ |
| Session共享 | 会话一致 | 一致 | ✅ |
3.3.2 会话管理验证
Session存储:
- 使用Redis存储会话信息
- Key:
session:{token} - TTL: 30分钟
验证结果: ✅ 通过
3.4 登出功能验证
3.4.1 单点登出测试
测试场景:
1. 用户已登录系统A和系统B
2. 用户在系统A执行登出
3. 认证中心通知所有子系统登出
4. 用户访问系统B,需要重新登录测试结果: ✅ 通过
| 步骤 | 预期结果 | 实际结果 | 状态 |
|---|---|---|---|
| 系统A登出 | 成功登出 | 成功 | ✅ |
| 系统B状态 | 会话失效 | 会话失效 | ✅ |
| 认证中心状态 | 清除会话 | 已清除 | ✅ |
4. 性能测试
4.1 登录接口性能
| 指标 | 目标值 | 实测值 | 状态 |
|---|---|---|---|
| 平均响应时间 | < 500ms | 320ms | ✅ |
| 95分位响应时间 | < 800ms | 580ms | ✅ |
| 并发用户数 | 100 | 100 | ✅ |
| TPS | > 50 | 68 | ✅ |
4.2 Token验证性能
| 指标 | 目标值 | 实测值 | 状态 |
|---|---|---|---|
| Token解析时间 | < 10ms | 5ms | ✅ |
| 签名验证时间 | < 20ms | 12ms | ✅ |
5. 与现有系统集成验证
5.1 与AD/LDAP集成
验证内容:
- 支持从AD域同步用户
- 支持AD域账号登录
测试结果: ✅ 可行
java
// LDAP配置示例
@Configuration
public class LdapConfig {
@Bean
public LdapTemplate ldapTemplate() {
LdapContextSource contextSource = new LdapContextSource();
contextSource.setUrl("ldap://ad.company.com:389");
contextSource.setBase("dc=company,dc=com");
return new LdapTemplate(contextSource);
}
}5.2 与现有用户体系集成
验证内容:
- 支持现有MySQL用户表
- 支持自定义用户属性扩展
测试结果: ✅ 可行
6. 问题与解决方案
6.1 发现的问题
| 问题 | 影响 | 解决方案 |
|---|---|---|
| Token过期后页面跳转问题 | 中 | 前端拦截401,自动刷新Token |
| 跨域配置复杂 | 低 | 统一配置CORS白名单 |
6.2 优化建议
- Token刷新策略:Access Token过期前5分钟自动刷新
- 会话持久化:重要操作前验证会话有效性
- 安全增强:增加登录失败锁定机制
7. 验证结论
7.1 总体结论
✅ 验证通过
基于OAuth 2.0 + OIDC的SSO单点登录方案技术上可行,满足系统平台项目需求。
7.2 验证项汇总
| 验证项 | 状态 | 说明 |
|---|---|---|
| OAuth 2.0授权码模式 | ✅ 通过 | 流程完整,符合标准 |
| JWT令牌机制 | ✅ 通过 | 生成、验证、刷新正常 |
| 单点登录 | ✅ 通过 | 多系统间会话共享正常 |
| 单点登出 | ✅ 通过 | 全局登出功能正常 |
| 性能指标 | ✅ 通过 | 满足性能要求 |
| 系统集成 | ✅ 通过 | 可与AD/LDAP集成 |
7.3 风险与建议
| 风险 | 等级 | 建议 |
|---|---|---|
| Token泄露风险 | 中 | 使用HTTPS,设置合理过期时间 |
| 会话劫持风险 | 中 | 绑定IP/UserAgent,异常检测 |
| 高并发性能 | 低 | 生产环境需做压力测试 |
8. 下一步行动
- [ ] 生产环境详细设计
- [ ] 安全加固方案
- [ ] 性能优化方案
- [ ] 灾备方案设计
文档版本历史
| 版本 | 日期 | 修改内容 | 修改人 |
|---|---|---|---|
| 1.0 | 2026-03-10 | 初始版本 | 系统架构师 |
