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. 解决方案步骤
-
统一认证服务:
- 创建一个独立的服务专门处理登录请求,所有需要进行SSO的应用都指向这个服务进行身份验证。
- 认证成功后,由该服务发放Token。
-
Token生成与分发:
- 利用JWT等技术生成Token。例如,使用
jjwt库创建JWT:String token = Jwts.builder() .setSubject("user") .claim("userId", "123456") .signWith(SignatureAlgorithm.HS256, secretKey) .compact(); - 将此Token返回给客户端保存。
- 利用JWT等技术生成Token。例如,使用
-
**跨域资源共享(CORS)**配置:
- 在各应用服务器上配置CORS,允许从其他域发起的带有Token的请求。
-
中间件/拦截器设置:
- 每个应用程序都需要有一个拦截器来检查每个请求中的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; } }
-
Token刷新策略:
- 考虑到安全性,应该定期更新Token,避免长期有效的Token带来的风险。
通过上述方法,A系统生成的Token可以被B系统识别并验证,因为它们都依赖于相同的加密密钥和算法。这种方式不仅提高了安全性,也简化了多系统间的数据同步问题。希望这些信息对你有所帮助!
解决 无用评论 打赏 举报