设计一个 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.pswp.cn/diannao/87884.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87884.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/87884.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《信息技术》科技核心期刊推荐

【科研必看】《信息技术》——科技核心期刊&#xff0c;助力你发表高影响力论文&#xff01; 如果你是一位科研工作者、学者或者在校学生&#xff0c;正在为发表论文而努力&#xff0c;那么《信息技术》期刊无疑是你不可错过的选择&#xff01;这本期刊以其卓越的学术影响力&am…

界面组件DevExpress WPF中文教程:Grid - 如何遍历节点?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

2D写实交互数字人:让AI形象拥有“真人温度“的技术革命

在人工智能技术日新月异的今天&#xff0c;数字人已不再是科幻电影中的概念&#xff0c;而是逐步渗透到我们日常生活的各个领域。然而&#xff0c;市场上大多数数字人产品仍停留在"能说会动"的初级阶段&#xff0c;缺乏真正的情感交互能力&#xff0c;这种"机械…

2025 年拓客系统排行榜

在数字化营销时代&#xff0c;拓客系统成为企业获取客户资源、提升销售效率的关键工具。以下为您盘点 2025 年表现出色的中文名字拓客系统&#xff0c;其中 微拓客 凭借强大功能脱颖而出&#xff0c;成为众多从业者的首选。 一、微拓客&#xff1a;精准拓客的全能王者 微拓客堪…

TikTok 矩阵如何快速涨粉

在社交媒体的广袤天地里&#xff0c;TikTok 以其强大的影响力和庞大的用户基础&#xff0c;成为众多创作者和品牌竞相角逐的舞台。构建 TikTok 矩阵&#xff0c;是扩大影响力、实现快速涨粉的有效策略。那么&#xff0c;究竟如何让 TikTok 矩阵快速涨粉呢&#xff1f;下面将为您…

基于微信小程序和云开发的企业绿色融资平台的设计与实现

文章目录 摘要前言绪论1. 课题背景2. 国内外现状与趋势2.1 国内研究现状2.2 国外研究现状2.3 发展趋势3. 课题内容相关技术与方法介绍1. 微信小程序开发技术2. 腾讯云开发平台3. 绿色项目评估模型4. 智能匹配算法5. 碳核算方法系统分析1. 需求分析1.1 用户需求1.2 功能需求1.3 …

如何自建服务器并开启公网IP:本地内网网址让外网访问详细教学

本地内网环境自建服务器后&#xff0c;如何让外网访问&#xff0c;提供互联网连接服务呢&#xff1f;有不少方法都可以实现&#xff0c;常见的有如公网IP、DDNS动态域名、nat123内网穿透等&#xff0c;下面详细教学。 一、申请开公网IP-----------------公网IP篇-------------…

企业公用电脑登录安全管控的终极方案:ASP操作系统安全登录管控方案

一、引言&#xff1a;公用电脑——企业安全管理的“灰色地带” 在企业办公场景中&#xff0c;公用电脑&#xff08;如会议室电脑、生产线终端、客服工位&#xff09;因多用户共用、权限复杂&#xff0c;往往成为安全管理的薄弱环节。员工随意登录、弱密码泛滥、敏感数据泄露事…

HarmonyOS-ArkTS开发指南:从基础到实战

目录 一、基础语法 二、声明式 UI 开发 基本组件结构 三、状态管理 四、生命周期钩子 五、组件化开发 1. 创建自定义组件 2. 组件嵌套 六、事件处理 七、布局系统 八、样式设置 九、条件渲染与列表渲染 十、异步操作 十一、路由导航 开发建议 一、基础语法 ArkT…

算法-Day04

今天还是给大家分享几道题目&#xff0c;希望大家可以好好理解。 第一题 问题描述 小蓝有一天误入了一个混境之地。 好消息是&#xff1a;他误打误撞拿到了一张地图&#xff0c;并从中获取到以下信息&#xff1a; 混境之地是一个 n⋅m大小的矩阵&#xff0c;这个地图中一共…

Git版本控制详细资料

Git安装基本配置 下载安装(一路next) 打开bash终端&#xff08;git专用&#xff09; 命令: git -v(查看版本号) 配置: 用户名和邮箱,应用在每次提交代码版本时表明自己身份 命令: git config --global user.name "FT" git config --global user.email "F…

利用井云平台把Coze工作流接入小程序/网站封装变现 | 详细步骤→

今天来看看怎么把Coze工作流接入井云生成你的专属网站/小程序&#xff01; 当前已支持三大模块接入&#xff1a;✅ 工作流 ✅ 智能体 ✅ 外部网页 本文所用工具 1、扣子&#xff1a;www.coze.cn 2、井云智能体&#xff1a;jingyun.center 为什么选择井云平台&#xff1f; …

linux weston flutter remote desktop

参考:Outputs — weston 14.0.90 documentation Weston 14.0: DRM-backend, color management, and output mirroring Weston 14.0: DRM-backend, color management, and output mirroring 🖥️ 3. DRM 输出可镜像至远程输出(RDP、VNC、PipeWire) 这次更新还带来了一个…

GitHub Copilot 是什么,怎么使用

GitHub Copilot 是一个由 GitHub 和 OpenAI 联合开发的 AI 编程助手&#xff0c;它可以在你写代码的时候自动给出建议、补全代码&#xff0c;甚至生成整个函数或算法。它就像一个“聪明的副驾驶”&#xff0c;时刻在你旁边协助你写代码。 简单解释&#xff1a; GitHub Copilot …

Android系统及应用QUIC协议支持详解

QUIC协议在Android中的全面支持与实践指南 本文深入探讨QUIC协议在Android中的实现细节&#xff0c;涵盖基础原理、开发技巧、性能优化及前沿扩展&#xff0c;提供完整的Kotlin代码示例和工程实践指南。 1. QUIC协议核心优势 QUIC&#xff08;Quick UDP Internet Connections&…

.NET基于类名约定的自动依赖注入完整指南

&#x1f680; .NET基于类名约定的自动依赖注入完整指南 基于类名约定的自动依赖注入可大幅减少手动注册服务的工作量&#xff0c;本文将通过清晰的结构、美观的排版和丰富的示例&#xff0c;帮助你快速掌握这一实用技术。 &#x1f308; 核心特性概览 特性说明类名约定自动…

Redis各数据结构的详细使用和使用场景

Redis各数据结构的详细使用 大家好&#xff01;今天我们来聊聊Redis这个强大的内存数据库。就像我们生活中的工具箱一样&#xff0c;Redis提供了多种"工具"&#xff08;数据结构&#xff09;来帮助我们解决不同的问题。有些工具像螺丝刀&#xff08;字符串&#xff…

MSYS2 环境下 Python 开发配置(结合 PyCharm)使用笔记

【笔记】MSYS2 的 MinGW64 环境中正确安装 Python 相关环境管理工具 &#xff08;Poetry、Virtualenv、Pipenv 和 UV&#xff09;-CSDN博客 MSYS2 环境配置与 Python 项目依赖管理笔记_msys更新python-CSDN博客 【技术笔记】MSYS2 指定 Python 版本安装方案_pacman -u 安装指定…

Python爬虫实战:研究Splinter相关技术

1. 引言 1.1 研究背景与意义 随着 Web 2.0 技术的发展,现代网页越来越多地采用 JavaScript 动态生成内容。传统爬虫通过直接请求 HTML 页面的方式,无法获取这些动态渲染的内容,导致爬取数据不完整。据统计,全球前 1000 名网站中,超过 70% 的页面包含动态加载内容 。Spli…

大气商务工作汇报总结PPT模版分享

蓝色商务工作总结PPT模版&#xff0c;莫兰迪工作总结PPT模版&#xff0c;年中工作汇报PPT模版&#xff0c;简约工作汇报PPT模版&#xff0c;上半年工作总结PPT模版&#xff0c;极简工作汇报PPT模版&#xff0c;欧美简约PPT模版&#xff0c;大气商务通用PPT模版&#xff0c;团队…