深度解析:Java + Vue 项目实战全景指南)
一句话定位单点登录SSO不是“同一个账号登录多个系统”而是“一次认证全体系信任”。在 Java Vue 前后端分离架构下它的本质是把“登录”从各个业务系统中抽离出来交给一个独立的认证中心统一管理并通过标准化的令牌传递机制实现跨系统、跨域的身份互认。一、什么是 SSO——为什么需要它1.1 传统登录的三大痛点在多系统企业中用户每天可能要切换 OA、CRM、财务等多个系统每进入一个系统都要重新输入账号密码 。这背后的本质问题是痛点表现根源用户体验差每个系统独立登录账号密码重复输入各系统独立维护 Session开发维护难每个系统都要做登录模块密码策略变更需全量修改认证逻辑分散安全风险高用户密码重复使用一处泄露处处危险缺乏统一的认证管理1.2 SSO 的解决方案SSO 通过引入一个独立的认证中心IdP将用户的登录态从“各系统分别记住”变成“认证中心统一管理”让“一次登录全网通行”成为现实 。二、SSO 的核心架构与关键角色2.1 三大核心角色角色英文职责在 JavaVue 项目中对应身份提供商IdPIdentity Provider负责用户登录验证、颁发令牌、管理全局会话独立的 SSO 认证服务Java Spring Boot 开发服务提供商SPService Provider各业务子系统依赖 IdP 完成认证各个 Vue Java 业务系统用户User终端使用者浏览器端用户2.2 核心组件职责拆分组件核心职责技术选型参考认证中心SSO Server用户登录、颁发 Token、验证 Token 有效性、管理全局会话Spring Boot Spring Security JWT Redis业务系统SSO Client拦截未登录请求、向认证中心校验 Token、建立本地会话JavaSpring Security 过滤器 / 拦截器Vue路由守卫 Axios 拦截器令牌存储存储 Token 与用户信息的映射关系支持分布式 SessionRedis分布式缓存三、SSO 的运行流程3.1 首次登录完整认证流程3.2 访问第二个系统免登录流程步骤操作关键点1用户访问业务系统B—2系统B检测到无本地Token重定向到认证中心3认证中心检测到全局会话存在通过 Cookie 中的 SessionId 判断4直接颁发Token给系统B无需再次输入密码5系统B建立本地会话用户免登录访问成功核心机制用户浏览器在 IdP 域名下保存了全局会话 Cookie这是“一次登录、多系统互通”的关键凭证 。3.3 退出登录模式行为实现方式全局登出用户登出一个系统所有系统同步登出销毁IdP全局会话 通知所有SP销毁局部会话局部登出仅登出当前系统仅销毁该SP的本地会话四、SSO 在 Java Vue 项目中的技术实现全景4.1 前后端分离架构下的 SSO 设计在 Java Vue 前后端分离架构下SSO 的实现需要额外处理跨域问题。核心思路是前端统一管理 Token后端统一校验 Token。层组件SSO 相关职责前端Vue路由守卫拦截未登录请求重定向到认证中心Axios 拦截器自动在请求头中携带 TokenToken 存储存储在 localStorage 或 Cookie 中后端Java过滤器 / 拦截器拦截请求校验 Token 有效性Token 解析从 Token 中提取用户信息用户信息注入将用户信息注入到当前线程上下文4.2 前端关键实现javascript// Vue 路由守卫检查登录状态 router.beforeEach(async (to, from, next) { const token localStorage.getItem(sso_token) if (!token) { // 重定向到 SSO 认证中心 window.location.href ${SSO_SERVER_URL}/login?redirect${encodeURIComponent(window.location.href)} return } // 验证 token 有效性调用后端接口 const isValid await verifyToken(token) if (!isValid) { window.location.href ${SSO_SERVER_URL}/login?redirect${encodeURIComponent(window.location.href)} return } next() }) // Axios 拦截器自动携带 Token axios.interceptors.request.use(config { const token localStorage.getItem(sso_token) if (token) { config.headers.Authorization Bearer ${token} } return config })4.3 后端关键实现java// Spring Boot 过滤器拦截并校验 Token Component public class SsoAuthenticationFilter extends OncePerRequestFilter { Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) { String token request.getHeader(Authorization); if (token null) { // 重定向到 SSO 认证中心 response.sendRedirect(ssoServerUrl /login); return; } // 向认证中心校验 Token或本地 JWT 验签 UserInfo user ssoClient.verifyToken(token); if (user null) { response.sendRedirect(ssoServerUrl /login); return; } // 将用户信息注入当前线程上下文 SecurityContextHolder.getContext().setAuthentication( new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities()) ); filterChain.doFilter(request, response); } }五、SSO 的主流实现方案对比方案核心机制优点缺点适用场景基于 CookieSessionIdP 域名下保存全局 Session Cookie实现简单易于控制登出跨域限制严格扩展性差同一主域下的企业内部系统基于 JWT轻量级 SSOIdP 签发 JWTSP 本地验签无状态跨域友好实现简单无法主动销毁Token 泄露风险跨域场景移动端微服务基于 OAuth 2.0 OIDC标准协议支持授权码流程行业标准支持多种授权模式安全性高实现复杂需维护多套端点需要对接第三方应用开放平台基于 CAS 协议票据Ticket交换机制成熟稳定专为 SSO 设计需部署独立 CAS Server高校、政府等传统企业级应用5.1 JWT vs OAuth 2.0关键区别对比维度基于 JWT基于 OAuth 2.0 / OIDC核心用途身份认证Authentication授权Authorization 身份认证Token 验证SP 本地验签无状态SP 需向 IdP 验证或有状态安全性需妥善管理私钥支持授权码 PKCE 等增强安全机制适用场景内部系统轻量级应用对接第三方应用开放平台六、SSO 落地的关键技术要点6.1 跨域问题处理在前后端分离架构中前端和后端可能部署在不同域名下。处理方式 方案实现方式适用场景Cookie 携带 Token设置withCredentials: true后端配置 CORS同主域或已配置 Cookie 跨域共享Authorization Header前端将 Token 存入 localStorage通过请求头传递完全跨域场景最通用URL 参数传递Token 通过 URL 参数传递仅限首次授权回调场景6.2 令牌存储策略存储位置优点缺点安全建议localStorage容量大持久化存在 XSS 攻击风险不适合存储敏感 Token建议配合HttpOnly CookieHttpOnly Cookie防止 XSS 读取受域名限制存在 CSRF 风险配合SameSiteStrict和 CSRF TokenSession Storage关闭标签页即清除跨标签页不共享适合临时性 Token6.3 分布式 Session 管理在分布式部署场景下必须解决 Session 共享问题。推荐使用Redis 作为分布式 Session 存储java// 使用 Redis 存储用户会话信息 Autowired private RedisTemplateString, Object redisTemplate; public void saveSession(String token, UserInfo user) { redisTemplate.opsForValue().set( sso:session: token, user, 30, TimeUnit.MINUTES ); } public UserInfo getSession(String token) { return (UserInfo) redisTemplate.opsForValue() .get(sso:session: token); }七、SSO 实战全景架构图text┌─────────────────────────────────────────────────────────────────┐ │ 用户浏览器 │ └─────────────────────────────┬───────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 前端层Vue │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 系统A前端 │ │ 系统B前端 │ │ 系统C前端 │ │ │ │ 路由守卫拦截 │ │ 路由守卫拦截 │ │ 路由守卫拦截 │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ └─────────┼────────────────┼────────────────┼───────────────────┘ │ │ │ ▼ ▼ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 后端层Java │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 系统A后端 │ │ 系统B后端 │ │ 系统C后端 │ │ │ │Token校验过滤器│ │Token校验过滤器│ │Token校验过滤器│ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ └─────────┼────────────────┼────────────────┼───────────────────┘ │ │ │ └────────────────┼────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ SSO 认证中心Java │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 登录认证接口 │ │ Token签发 │ │ Token校验 │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ └─────────────────────────────┬───────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ Redis分布式Session存储 │ │ Token → 用户信息 映射存储 / 黑名单管理 │ └─────────────────────────────────────────────────────────────────┘八、总结维度核心结论SSO 的本质将“登录”从各业务系统中抽离交给独立的认证中心统一管理实现“一次认证全体系信任”核心组件身份提供商IdP 服务提供商SP 令牌存储Redis主流方案CookieSession同域、JWT跨域、OAuth2OIDC标准化、CAS传统企业前后端分离架构要点前端路由守卫拦截 Axios 自动携带 Token后端过滤器统一校验 Token关键设计决策JWT 无状态适合跨域需配合黑名单处理登出OAuth2 标准协议适合对接第三方安全建议HttpOnly Cookie 存储 Token 防止 XSS结合 CORS 和 CSRF Token 加固防护九、按技术栈场景技术场景具体场景推荐方案同一主域下的多应用同一公司下的多个业务系统共享二级域名如app1.example.com、app2.example.comCookieSession同域SSO实现最简单完全跨域的多应用不同域名下的多个系统如oa.company.com、crm.company.comJWT OAuth2/OIDC跨域SSO前后端分离架构Vue/React 前端 Java/Go 后端前端部署在静态站点后端独立服务JWT Authorization Header移动端 PC 端同一套用户体系同时支撑 Web 端和 APP 端JWT Refresh Token