SpringBoot + OAuth2 + JWT:统一认证中心搭建,SSO 单点登录从 0 到 1 落地
SpringBoot + OAuth2 + JWT:统一认证中心搭建,SSO 单点登录从 0 到 1 落地
你是否曾经为每个系统都要重复实现用户认证而烦恼?是否因为用户需要在不同系统间反复登录而影响体验?今天,我要分享一个企业级解决方案——使用SpringBoot集成OAuth2和JWT来搭建统一认证中心,实现SSO单点登录,让你的系统架构更加优雅和安全!
为什么需要统一认证中心和SSO?
在微服务架构盛行的今天,一个企业往往有数十个甚至上百个应用系统。如果每个系统都独立实现用户认证,会出现以下问题:
- 用户体验差:用户需要在不同系统间反复登录
- 维护成本高:每个系统都要实现认证逻辑
- 安全隐患大:分散的认证难以统一安全管理
- 扩展性差:新增系统需要重新实现认证
统一认证中心和SSO单点登录正是解决这些问题的最佳方案。
技术选型:为什么选择OAuth2 + JWT?
OAuth2的优势
- 标准化协议:业界广泛认可的安全授权框架
- 灵活性强:支持多种授权模式
- 生态完善:各大厂商都有成熟的实现
JWT的优势
- 无状态:服务端不需要存储会话信息
- 跨域支持:天然支持分布式系统
- 自包含:Token中包含用户信息,减少数据库查询
- 易传输:可通过URL、POST参数或HTTP头传输
核心实现思路
我们的目标是构建一个完整的统一认证中心,整体架构如下:
用户浏览器 -> 认证中心 -> 应用系统A
-> 应用系统B
-> 应用系统C
1. 用户实体和数据访问层
首先,我们需要定义用户实体和数据访问层:
@Entity
@Table(name = "users")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
private String username;
private String password;
private String email;
private Boolean enabled = true;
}
2. JWT工具类设计
JWT工具类是整个认证系统的核心,负责Token的生成和验证:
@Component
public class JwtTokenUtil implements Serializable {
// 从token中获取用户名
public String getUsernameFromToken(String token) {
return getClaimFromToken(token, Claims::getSubject);
}
// 验证token
public Boolean validateToken(String token, UserDetails userDetails) {
final String username = getUsernameFromToken(token);
return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
}
// 生成token
public String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
return doGenerateToken(claims, userDetails.getUsername());
}
}
3. 认证过滤器实现
JWT认证过滤器负责拦截请求并验证Token:
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain) throws ServletException, IOException {
final String requestTokenHeader = request.getHeader("Authorization");
String username = null;
String jwtToken = null;
// 提取token
if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) {
jwtToken = requestTokenHeader.substring(7);
try {
username = jwtTokenUtil.getUsernameFromToken(jwtToken);
} catch (Exception e) {
logger.error("JWT Token已过期");
}
}
// 验证token
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
UserDetails userDetails = this.userService.loadUserByUsername(username);
if (jwtTokenUtil.validateToken(jwtToken, userDetails)) {
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken =
new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
}
}
chain.doFilter(request, response);
}
}
4. 安全配置
安全配置类整合了Spring Security和JWT:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.anyRequest().authenticated();
// 添加JWT认证过滤器
http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
}
}
SSO单点登录流程
完整的SSO流程如下:
- 用户访问应用系统:用户尝试访问受保护资源
- 重定向到认证中心:应用系统检测到未登录,重定向到统一认证中心
- 用户认证:用户在认证中心输入凭证进行登录
- 颁发Token:认证中心验证通过后颁发JWT Token
- 访问资源:用户携带Token访问各应用系统
- Token验证:各应用系统验证Token有效性
- 授权访问:Token有效则允许访问受保护资源
实际应用场景
这套统一认证中心可以在多个场景中发挥作用:
1. 企业内部系统
在一个企业中,往往有OA系统、CRM系统、ERP系统等多个应用,通过统一认证中心可以实现一次登录,全部访问。
2. 互联网平台
像阿里云、腾讯云这样的平台,有众多子产品和服务,统一认证中心让用户在各个产品间无缝切换。
3. 教育系统
学校的教务系统、图书馆系统、宿舍管理系统等可以通过SSO实现统一登录。
安全性考虑
虽然统一认证中心功能强大,但在生产环境中使用时必须注意安全性:
- HTTPS传输:所有Token传输必须通过HTTPS加密
- Token过期机制:设置合理的Token过期时间
- 刷新Token:实现Token刷新机制,避免频繁重新登录
- 权限最小化:遵循权限最小化原则,只授予必要权限
- 日志审计:记录所有认证和授权操作日志
总结
通过SpringBoot + OAuth2 + JWT实现统一认证中心和SSO单点登录,我们可以构建一个安全、高效、易维护的认证体系。这套方案已经在众多大型互联网公司得到广泛应用,能够显著提升用户体验和系统安全性。
当然,任何技术都不是银弹,在享受便利的同时也要注意潜在的风险。希望今天的分享能给大家带来一些启发,让我们一起探索更多有趣的技术方案!
项目源码:关注公众号并回复"oauth2-jwt"获取完整源码
交流学习:欢迎加入我们的技术交流群,一起探讨更多后端技术干货
标题:SpringBoot + OAuth2 + JWT:统一认证中心搭建,SSO 单点登录从 0 到 1 落地
作者:jiangyi
地址:http://www.jiangyi.space/articles/2025/12/21/1766304287869.html