1. 什么是 SSO?
单点登录(Single Sign-On,简称 SSO)是一种身份认证方式,允许用户在多个应用系统之间只需登录一次,即可访问所有受信任的应用,而无需在每个应用中重复输入用户名和密码。
SSO 的优点
- 减少重复登录:用户只需登录一次,提高使用体验。
- 统一认证管理:集中管理用户身份,增强安全性。
- 降低运维成本:减少多系统间的重复开发,提高维护效率。
SSO 的常见模式
模式 | 说明 |
---|---|
基于 Cookie | 适用于同一域名下的多个子系统,通过共享 Cookie 进行身份认证。 |
基于 Token(JWT) | 用户认证后返回一个 Token,携带该 Token 访问其他系统,实现无状态认证。 |
OAuth2.0 | 通过授权服务器统一管理身份,应用系统通过授权码或访问令牌进行认证。 |
SAML(Security Assertion Markup Language) | 基于 XML 的身份认证协议,常用于企业级 SSO 方案,如企业微信、钉钉集成。 |
2. Spring Boot 实现 SSO
2.1 方案一:基于 Session + Redis 的 SSO
原理
- 用户在认证中心(SSO Server)登录,创建 Session 并存入 Redis。
- 其他系统(SSO Client)访问时,携带 Token 或 Cookie 进行身份校验。
- SSO Server 通过 Redis 进行 Session 共享,实现单点登录。
实现步骤
- 创建 SSO 认证服务,Spring Boot + Redis 存储 Session。
- 创建拦截器,在每个子系统中校验用户 Session。
- 实现登出功能,清除 Redis 中的 Session 数据。
核心代码示例:
@RestController
@RequestMapping("/auth")
public class AuthController {
@Autowired private RedisTemplate<String, String> redisTemplate;
@PostMapping("/login")
public ResponseEntity<?> login(@RequestParam String username, @RequestParam String password, HttpServletRequest request) {
// 1. 校验用户名和密码(略)
String sessionId = request.getSession().getId();
redisTemplate.opsForValue().set("SESSION:" + sessionId, username, 30, TimeUnit.MINUTES);
return ResponseEntity.ok(sessionId);
}
}
2.2 方案二:基于 JWT 实现 SSO
原理
- 用户登录后,服务器生成一个 JWT(包含用户信息、过期时间等),返回给前端。
- 前端携带 JWT 访问其他系统,后端解析 Token 验证身份。
- JWT 具有无状态性,可以在多个微服务中共享,无需存储 Session。
实现步骤
- 生成 JWT,包含用户 ID、权限等信息。
- 创建拦截器,在所有微服务中解析 Token。
- 设置 Token 过期时间,提高安全性。
核心代码示例:
public class JwtUtil {
private static final String SECRET = "mySecretKey";
public static String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + 3600000))
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
}
public static Claims parseToken(String token) {
return Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody();
}
}
2.3 方案三:基于 OAuth2.0 实现 SSO
OAuth2.0 是一种授权协议,适用于多个系统的身份认证。Spring Security 提供了完整的 OAuth2.0 解决方案。
OAuth2.0 流程
- 用户访问客户端应用,跳转到授权服务器(SSO Server)。
- 授权服务器认证成功后,返回授权码(Authorization Code)。
- 客户端使用授权码获取访问令牌(Access Token)。
- 其他服务使用 Access Token 进行身份校验。
Spring Security OAuth2.0 实现
- 配置 OAuth2 服务器(Authorization Server)。
- 配置 OAuth2 客户端,使用授权码获取 Token。
- 资源服务器 解析 Token,进行身份校验。
3. SSO 安全性优化
- Token 签名防篡改(HMAC、RSA 加密)
- Token 过期时间管理(短 Token + Refresh Token)
- 限制 Token 使用范围(OAuth2 Scope 控制)
- 支持多因子认证(MFA)(如短信验证码、指纹识别等)
4. 企业级 SSO 方案与实践
方案一:使用 Keycloak 搭建 SSO
Keycloak 是一个开源的身份认证与授权管理工具,支持 OAuth2、OpenID Connect、SAML 协议。
关键特性:
- 集中管理用户身份
- 支持社交登录(GitHub、Google、微信等)
- 适用于微服务架构,支持 JWT、OAuth2.0、LDAP
Keycloak 快速搭建
docker run -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin quay.io/keycloak/keycloak:latest
方案二:企业级 SSO 设计
- 支持 OAuth2.0 / SAML,兼容现有系统。
- 接入企业身份管理(如 LDAP、CAS、Okta)。
- 集中管理权限(RBAC / ABAC 权限模型)。
5. 总结
方案 | 适用场景 |
---|---|
Session + Redis | 适用于小型企业、同域系统间的 SSO。 |
JWT 无状态认证 | 适用于微服务架构,无需存储 Session。 |
OAuth2.0 / Keycloak | 适用于企业级 SSO,支持多协议集成。 |
SSO 作为现代身份认证的重要技术,能够提升系统安全性、用户体验,并降低维护成本。企业在选择 SSO 方案时,应结合自身架构需求,选择合适的认证方式,并考虑安全性优化方案,以确保用户数据安全。