546 words
2 minutes
单点登录(SSO)学习笔记
单点登录(SSO)学习笔记
1. 概念
SSO(Single Sign-On,单点登录) 是一种认证机制,用户只需登录一次,就可以访问多个相互信任的系统,无需再次输入用户名和密码。
优点
- 用户体验好:一次登录即可访问多个系统。
- 降低密码管理成本,提高安全性。
- 集中式管理:统一管理认证和权限。
缺点
- 单点故障风险:SSO 服务宕机可能导致所有应用无法访问。
- 实现复杂:涉及跨域、协议、安全等问题。
- 安全风险集中:SSO 安全漏洞会影响所有相关系统。
2. 核心原理
SSO 的核心是 认证和信任传递:
用户 -> 系统A -> SSO登录 -> Token/Cookie -> 系统A验证 -> 访问成功用户 -> 系统B -> 验证SSO Token -> 访问成功3. 常见 SSO 流程
3.1 Cookie + 重定向方式(示例)
1. 用户访问系统 A,检测未登录 -> 重定向到 SSO 登录中心2. 用户输入用户名密码 -> SSO 验证通过3. SSO 设置认证 Cookie4. 重定向回系统 A -> 系统 A 读取 Cookie -> 登录成功5. 用户访问系统 B -> 带 Cookie -> 验证通过 -> 登录成功3.2 Token(JWT)方式(示例)
// 前端请求系统AGET /systemA/resource
// 系统A重定向到SSOGET /sso/login?redirectUrl=/systemA
// 用户登录SSOPOST /sso/authenticate {username,password}
// SSO 返回JWT TokenHTTP 302 Redirect to /systemA?token=eyJhbGciOiJIUzI1NiIsInR...
// 系统A验证TokenClaims claims = Jwts.parser() .setSigningKey(secretKey) .parseClaimsJws(token) .getBody();System.out.println("User: " + claims.getSubject());4. 常见协议
| 协议 | 说明 |
|---|---|
| CAS (Central Authentication Service) | 经典 SSO 协议,支持 Ticket 验证 |
| OAuth2 | 授权框架,主要用于第三方应用授权登录 |
| OpenID Connect (OIDC) | 基于 OAuth2 的身份认证协议 |
| SAML | 基于 XML 的企业级单点登录协议 |
5. 示例实现
5.1 Spring Security + OAuth2
@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/login","/sso/**").permitAll() .anyRequest().authenticated() .and() .oauth2Login() .loginPage("/login") .defaultSuccessUrl("/home", true); }}5.2 CAS 客户端 Java 示例
@Configurationpublic class CasSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .logout().logoutSuccessUrl("/sso/logout") .and() .cas() .loginUrl("https://sso.example.com/login") .serviceProperties(serviceProperties()); }
@Bean public ServiceProperties serviceProperties() { ServiceProperties sp = new ServiceProperties(); sp.setService("https://app.example.com/login/cas"); sp.setSendRenew(false); return sp; }}6. 注意事项
- 跨域问题:不同域下 Cookie 无法共享,需要使用 Token 或配置 CORS。
- 安全性:Token/Cookie 必须加密和签名。
- 注销机制:设计全局退出,确保用户在所有系统登出。
- 过期与刷新:Token/Cookie 需要设置有效期,并支持刷新。
7. 实战建议
- 小型系统:Cookie + Session 足够。
- 多域/跨平台:JWT + OAuth2 或 OIDC。
- 企业级系统:SAML 或 Keycloak。
8. 流程图示例
+-------+ +------------+ +---------+| User | -----> | System A | ----> | SSO |+-------+ +------------+ +---------+ | | | | | <--- Redirect ---| | | | | <--- Token ---- | | | | | | | ------> verify ->| | | | | <---- success --| |9. 学习总结
- SSO 本质是“一次登录,多系统共享认证”。
- 常用实现方式:Cookie/Session、JWT、OAuth2/OIDC、CAS、SAML。
- 核心难点:跨域、全局登出、安全性、协议选择。
- 推荐实践:
- 小系统用 Cookie + Session
- 跨域系统用 OAuth2/JWT
- 企业应用用 Keycloak / SAML
Share
If this article helped you, please share it with others!
单点登录(SSO)学习笔记
https://mizuki.mysqil.com/posts/sso-learning/ Some information may be outdated
Related Posts Smart
1
一次失败的 AI 编程复盘:代码通过了,业务却错了
AI编程 通过一个订单取消失败案例,复盘模糊需求、错误上下文、表面测试和缺失 Review 如何让 AI 生成的代码顺利通过却违反业务规则。
2
AI 修改老项目时,如何控制影响范围
AI编程 以老项目订单状态筛选为例,讲清楚如何建立基线、限制修改范围、保护既有行为、审查 Diff,并为 AI 生成的改动准备回滚方案。
3
AI 说‘修好了’,我该如何验证
AI编程 从复现问题、检查 Diff、补回归测试到运行完整构建,整理一套不依赖 AI 自我声明的代码验证流程。
4
从需求到上线:用 AI 完成一个 Spring Boot 订单导出功能
AI编程 以 CSV 订单导出为例,记录如何让 AI 阅读项目、编写 Spec、分阶段实现、审查权限和数据边界,并用测试、构建与 Diff 验证结果。
5
从普通对话到 Agent:用 Java 实现一个最小旅行推荐 Agent
AI编程 不用 Agent 框架,使用 Java 21、Tool Calling 和一个清晰的循环,实现能够查询目的地、天气和景点的最小旅行推荐 Agent。






