当前位置: 首页 > news >正文

单点登录(SSO)系统

设计一个 Java 单点登录(SSO)系统需要解决跨系统认证和会话共享问题。以下是核心设计和实现方案,包含关键组件和代码示例:


一、核心概念

  1. 认证中心 (Auth Center):中央身份验证服务
  2. 令牌 (Token):用户身份凭证(推荐 JWT)
  3. 应用系统:接入 SSO 的子系统

二、SSO 登录流程

用户 应用系统A 认证中心 应用系统B 访问受限资源 重定向登录(携带回调地址) 提交凭证(用户名/密码) 验证凭证,生成JWT 重定向回调地址(带Token) 验证Token有效性 返回用户信息 创建本地会话,授予访问 访问资源 重定向(携带新回调地址) 检测全局会话存在 直接返回新Token 用户 应用系统A 认证中心 应用系统B

三、关键组件实现

1. JWT 工具类
import io.jsonwebtoken.*;
import java.util.Date;public class JwtUtil {private static final String SECRET = "your-256-bit-secret";private static final long EXPIRATION = 3600000; // 1小时public static String generateToken(String username) {return Jwts.builder().setSubject(username).setExpiration(new Date(System.currentTimeMillis() + EXPIRATION)).signWith(SignatureAlgorithm.HS256, SECRET).compact();}public static String parseToken(String token) {try {return Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody().getSubject();} catch (Exception e) {throw new RuntimeException("Token invalid");}}
}
2. 认证中心登录接口
@RestController
@RequestMapping("/auth")
public class AuthController {@PostMapping("/login")public ResponseEntity<?> login(@RequestBody LoginRequest request, HttpServletResponse response) {// 1. 验证用户名密码(省略数据库验证)if (!"admin".equals(request.getUsername()) || !"123456".equals(request.getPassword())) {return ResponseEntity.status(401).body("Invalid credentials");}// 2. 生成JWTString token = JwtUtil.generateToken(request.getUsername());// 3. 设置全局会话(Redis存储)redisTemplate.opsForValue().set("SESSION:" + token, request.getUsername());// 4. 返回Token给客户端return ResponseEntity.ok(new TokenResponse(token));}
}
3. Token 验证接口
@RestController
@RequestMapping("/auth")
public class AuthController {@GetMapping("/validate")public ResponseEntity<?> validateToken(@RequestParam String token) {try {// 1. 验证JWT有效性String username = JwtUtil.parseToken(token);// 2. 检查Redis会话是否存在if (redisTemplate.hasKey("SESSION:" + token)) {return ResponseEntity.ok(username);}return ResponseEntity.status(401).body("Session expired");} catch (Exception e) {return ResponseEntity.status(401).body("Invalid token");}}
}
4. 应用系统拦截器
public class SSOInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HttpSession session = request.getSession();// 1. 检查本地会话if (session.getAttribute("user") != null) {return true;}// 2. 检查请求中是否有TokenString token = request.getParameter("sso_token");if (token != null) {// 调用认证中心验证TokenString username = authService.validateToken(token);if (username != null) {session.setAttribute("user", username);return true;}}// 3. 重定向到认证中心登录String redirectUrl = "http://auth-center/login?redirect=" + URLEncoder.encode(request.getRequestURL().toString(), "UTF-8");response.sendRedirect(redirectUrl);return false;}
}

四、关键配置项

组件配置示例说明
Redisspring.redis.host=localhost存储全局会话
JWTjwt.secret=your-256-bit-secretHS256算法密钥
回调地址app.callback-url=http://app1/callback子系统注册的回调地址

五、安全增强措施

  1. HTTPS:所有通信强制使用 HTTPS
  2. 双重验证:JWT + Redis会话检查防止伪造
  3. CSRF防护:登录时生成随机 state 参数
  4. 黑名单:注销时加入 JWT 黑名单
  5. 令牌刷新:使用 refresh token 机制

六、扩展设计

  1. OAuth2集成:支持第三方登录(微信/Google)
@Bean
public ClientRegistrationRepository clientRegistrationRepository() {return new InMemoryClientRegistrationRepository(ClientRegistration.withRegistrationId("weixin").clientId("weixin-appid").clientSecret("weixin-secret").authorizationUri("https://...").build());
}
  1. 跨域支持:配置 @CrossOrigin 解决前后端分离问题
  2. 会话同步:使用 Redis Pub/Sub 实现全局注销

七、部署架构

                          +-----------------+|     用户浏览器    |+--------+--------+| (重定向)v
+----------------+           +-----+------+        +----------------+
|  应用系统A      |<--Token-->| 认证中心    |<--DB-->| 用户数据库       |
| (http://app1)  |           | (独立服务)  |        |                |
+----------------+           +-----^------+        +----------------+| (重定向)
+----------------+                 |
|  应用系统B      |<---------------+
| (http://app2)  |
+----------------+

通过以上设计,可实现:

  1. 一处登录,多系统通用
  2. 会话状态集中管理
  3. 安全可靠的 Token 机制
  4. 支持高并发和分布式部署

完整实现需补充数据库交互、错误处理、日志监控等模块,并参考 Spring Security OAuth2 或 Apache Shiro 等框架进行优化。

相关文章:

  • SpringAI1.0.0 入门案例
  • 教育培训APP源码核心功能开发详解:直播、考试、组卷系统全拆解
  • GNU Octave 基础教程(8):GNU Octave 常用数学函数
  • nginx服务器配置时遇到的一些问题
  • 从0开始学习计算机视觉--Day02--数据驱动
  • 一、什么是生成式人工智能
  • linux生产环境下根据关键字搜索指定日志文件命令
  • 嵌入式开发之嵌入式系统硬件架构设计时,如何选择合适的微处理器/微控制器?
  • TC、TM、RM如何协同解决分布式事务难题
  • 深入理解 Cross-Entropy 损失函数:从原理到实践
  • 5.5 misc驱动框架
  • SIEMENS 标准程序解读 ---> Fanuc(法那科)机器手通讯交互程序
  • csp基础之进制转换器
  • `shallowReactive` 与 `shallowRef`:浅层响应式 API
  • RA4M2开发涂鸦模块CBU(3)----定时器GPT-PWM调光
  • 【软考高级系统架构论文】论企业集成平台的理解与应用
  • Springfox使用详解
  • CPU Cache 的映射与寻址
  • Vue+spring boot前后端分离项目搭建---小白入门
  • Qt + C++ 入门2(界面的知识点)
  • 做企业网站 需要用服务器吗/网站建设方案设计书
  • 自动跳转手机网站/seo教程免费
  • 上海浦东刚刚发生的命案/文章优化关键词排名
  • 网站建设与管理培训活动总结/朋友圈推广怎么收费
  • 企业qq出售平台/seo公司费用
  • 建筑人才网证书挂靠/优化排名推广教程网站