当前位置: 首页 > 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 等框架进行优化。

http://www.lryc.cn/news/573149.html

相关文章:

  • 海伯森3D闪测传感器,工业检测领域的高精度利器
  • JavaEE:使用JMeter进行接口并发测试
  • 跨平台轻量级RTSP服务:重构内网超低延迟直播体验
  • 区块链是什么
  • AI与SEO关键词协同进化
  • 【StarRocks系列】查询语句执行全流程
  • 1. 常见K线组合
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 03(题目+回答)
  • 智慧医院核心引擎:IBMS 系统守护医疗环境高效与安全​
  • 内容搜索软件AnyTXT.Searcher忘记文件名也能搜,全文检索 1 秒定位文件
  • Python中字符串常用的操作方法
  • mysql导入大sql(比如10GB的sql文件)
  • 开源AI智能名片链动2+1模式S2B2C商城小程序:破解微商代理模式困局的数字化创新路径
  • MySQL存储引擎与架构
  • 在AI普及的大环境下神经网络在新能源汽车热管理系统中的应用简介
  • CLion开发Qt桌面程序_git的简单使用_小团体
  • opencv try-catch
  • day38-Django(4)
  • AI大模型学习之基础数学:高斯分布-AI大模型概率统计的基石
  • 自定义Django rest_framework中response的示例
  • 一个小BUG引发的对Mybatis-Plus的模糊查询的思考
  • 基于机器学习的侧信道分析(MLSCA)Python实现(带测试)
  • 从代码学习深度学习 - 预训练BERT PyTorch版
  • flutter环境变量记录
  • 为WIN10微软输入法的全角切换Bug禁用Shift+Space组合键
  • 软件工程概述知识点总结
  • (LeetCode ) 169. 多数元素(哈希表 || 二分查找)
  • python学智能算法(十五)|机器学习朴素贝叶斯方法进阶-CountVectorizer多文本处理
  • C++链表的虚拟头节点
  • Wire--编译时依赖注入工具