您的位置:首页 > 健康 > 美食 > 深圳龙岗疫情严重吗_律师如何做网络推广_看今天的新闻_seo算法是什么

深圳龙岗疫情严重吗_律师如何做网络推广_看今天的新闻_seo算法是什么

2025/5/10 4:51:08 来源:https://blog.csdn.net/2301_81922209/article/details/147195150  浏览:    关键词:深圳龙岗疫情严重吗_律师如何做网络推广_看今天的新闻_seo算法是什么
深圳龙岗疫情严重吗_律师如何做网络推广_看今天的新闻_seo算法是什么

双Token实现用户登录身份认证-Java版

1. 设计方案

方案概述:

  • Access Token: 短期有效的JWT,包含用户ID设备IDtoken版本号
  • Refresh Token: 长期有效的令牌,存储于Redis,关联用户信息、设备IDtoken版本号,用于刷新Access Token
  • 设备绑定: Token设备ID绑定,防止跨设备使用。
  • 安全性: 用户修改关键信息时递增token版本号,使旧Token失效。

整个流程大致如下:

  1. 用户登录,提供手机号密码设备ID
  2. 服务端验证通过后,生成access token(包含userIddeviceIdtokenVersion)和refresh token
  3. refresh token存储到Redis,key为refresh_token: + refreshToken,值为userIddeviceIdtokenVersion
  4. 客户端保存双token,并在请求时携带access token设备ID
  5. 拦截器验证access token的有效性,包括签名、过期时间、设备ID匹配、tokenVersion是否最新。
  6. access token过期后,客户端使用refresh token设备ID请求刷新。
  7. 服务端验证refresh token是否存在,设备ID是否匹配,tokenVersion是否一致,若通过则生成新的access token,Redis中的refresh token不变。
  8. 用户修改信息时,更新tokenVersion,使所有旧的refresh tokenaccess token失效。
  9. 不同设备的登录生成不同的refresh token,设备间无法混用,,同时减少token泄露带来的后续风险。
  10. 用户退出时,删除Redis中对应得refresh token

针对各个模块的代码实现:

  • JWT工具类:处理生成和解析token,包含tokenVersion
  • 登录接口:生成双token,存储refresh token到Redis。
  • 刷新接口:处理refresh token,生成新的access token
  • 拦截器:验证access token设备信息。
  • 用户修改信息:更新tokenVersion

2. 代码实现

2.1 数据库用户信息表结构

在这里插入图片描述

2.2 JWT工具类

@Getter
@Component
public class AuthJwtUtil {@Value("${auth.jwt.secretKey}")private String secretKey;@Value("${auth.jwt.access.expiration}")private long accessExpirationMs;@Value("${auth.jwt.refresh.expiration}")private long refreshExpirationMs;@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** 生成访问令牌accessToken* @param userId* @param deviceId* @param tokenVersion* @return*/public String generateAccessToken(Long userId, String deviceId, Integer tokenVersion) {return Jwts.builder().claim("userId", userId).claim("deviceId", deviceId).claim("tokenVersion", tokenVersion).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + accessExpirationMs)).signWith(SignatureAlgorithm.HS256, secretKey.getBytes(StandardCharsets.UTF_8)).compact();}/*** 解析访问令牌* @param token* @return*/public Claims parseAccessToken(String token) {return Jwts.parser().setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8)).parseClaimsJws(token).getBody();}/*** 生成刷新令牌refreshToken* @param userId* @param deviceId* @param tokenVersion* @return*/public String generateRefreshToken(Long userId, String deviceId, Integer tokenVersion) {String refreshToken = UUID.randomUUID().toString();AuthRefreshTokenInfo refreshTokenInfo = AuthRefreshTokenInfo.builder().userId(userId).deviceId(deviceId).tokenVersion(tokenVersion).build();String refreshKey = "refresh_token:" + refreshToken;redisTemplate.opsForValue().set(refreshKey, refreshTokenInfo, Duration.ofMillis(refreshExpirationMs));return refreshToken;}
}

2.3 请求拦截器

@Component
public class AuthInterceptor implements HandlerInterceptor {@Autowiredprivate AuthJwtUtil jwtUtil;@Autowiredprivate AuthService authService;@Overridepublic boolean preHandle(

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com