duochirou 2024-12-30 16:03 采纳率: 0%
浏览 14

javaweb中的单点登录如何实现的

javaweb中,不同系统之间如何做单点的呢?我们现在是维护了一张映射表,通过A系统登录的信息,查询他映射的B系统的账号和密码,实现了免登录,正常的做法是什么样的呢?网上说的token,我不太明白,A系统的token,传给B系统,B系统如何能识别到token中存储到B系统的用户信息和权限呢

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2024-12-30 16:06
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    在Java Web中实现单点登录(SSO, Single Sign-On)通常涉及跨多个应用或系统共享认证信息。你提到的方法,即通过维护一张映射表来关联不同系统的账号和密码,虽然可以工作,但存在明显的安全风险和管理复杂性问题。更推荐的做法是采用基于令牌的认证机制,如JWT (JSON Web Tokens) 或者 OAuth2.0 等标准协议。下面我将详细介绍如何使用Token实现单点登录,并解答你的疑问。

    1. 使用Token实现SSO的基本原理

    • 生成Token:用户首次访问任何一个系统时,该系统会验证用户的凭证(用户名/密码),如果验证成功,则生成一个包含用户身份信息的Token。
    • 共享Token:这个Token被发送回客户端,并存储在Cookie或LocalStorage中。当用户尝试访问其他相关联的应用时,Token会被自动携带到请求头中。
    • 验证Token:目标系统接收到请求后,检查Token的有效性和合法性。这通常涉及到解密Token以及验证其签名以确保数据未被篡改。
    • 提取信息:一旦确认Token有效,可以从Token中解析出用户的身份信息,从而允许用户无需再次登录即可访问资源。

    2. 解决方案步骤

    1. 统一认证服务

      • 创建一个独立的服务专门处理登录请求,所有需要进行SSO的应用都指向这个服务进行身份验证。
      • 认证成功后,由该服务发放Token。
    2. Token生成与分发

      • 利用JWT等技术生成Token。例如,使用jjwt库创建JWT:
        String token = Jwts.builder()
            .setSubject("user")
            .claim("userId", "123456")
            .signWith(SignatureAlgorithm.HS256, secretKey)
            .compact();
        
      • 将此Token返回给客户端保存。
    3. **跨域资源共享(CORS)**配置:

      • 在各应用服务器上配置CORS,允许从其他域发起的带有Token的请求。
    4. 中间件/拦截器设置:

      • 每个应用程序都需要有一个拦截器来检查每个请求中的Token是否有效。
      • 示例代码(Spring Boot项目):
        @Component
        public class JwtInterceptor implements HandlerInterceptor {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                final String authHeader = request.getHeader("Authorization");
                if (authHeader == null || !authHeader.startsWith("Bearer ")) {
                    throw new RuntimeException("无效的Token");
                }
                try {
                    Jwts.parser().setSigningKey(secretKey).parseClaimsJws(authHeader.replace("Bearer ", ""));
                } catch (Exception e) {
                    throw new RuntimeException("无法解析Token");
                }
                return true;
            }
        }
        
    5. Token刷新策略

      • 考虑到安全性,应该定期更新Token,避免长期有效的Token带来的风险。

    通过上述方法,A系统生成的Token可以被B系统识别并验证,因为它们都依赖于相同的加密密钥和算法。这种方式不仅提高了安全性,也简化了多系统间的数据同步问题。希望这些信息对你有所帮助!

    评论

报告相同问题?

问题事件

  • 创建了问题 12月30日