做图神器的网站商场设计平面布置图
news/
2025/10/1 4:39:46/
文章来源:
做图神器的网站,商场设计平面布置图,无锡百姓网免费发布信息网,qq网页版 登陆应用场景
当用户登录状态到登出状态时#xff0c;对应的JWT的令牌需要设置为失效状态#xff0c;这时可以使用基于 Redis 的黑名单方案来实现JWT令牌失效。
基于 Redis 的黑名单方案
当用户需要登出系统时#xff0c;将用户携带的Token进行解析#xff0c;解码出JWT令牌…应用场景
当用户登录状态到登出状态时对应的JWT的令牌需要设置为失效状态这时可以使用基于 Redis 的黑名单方案来实现JWT令牌失效。
基于 Redis 的黑名单方案
当用户需要登出系统时将用户携带的Token进行解析解码出JWT令牌取出对应的 UUID 和 过期时间 用过期的时间减去当前的时间计算出这个Key的过期时间再以这两个字段拼接作为 Key 并设置好过期时间存储到 Redis 中如果有黑客拿窃取出来的JWT令牌进行登录只要判断这个JWT令牌是否在黑名单就可以。
实现步骤
1.获得携带的Token解析并取出JWT令牌的代码
这段代码实现了对指定 JWT 的验证和使令牌失效的操作。
首先通过调用 convertToken(headerToken) 方法将传入的头部令牌 headerToken 转换成实际的 JWT 字符串 token。然后使用 HMAC256 算法和预设的密钥 key 创建一个算法实例 algorithm。接下来使用算法实例 algorithm 构建一个 JWT 验证器 jwtVerifier。这个验证器将用于验证 JWT 的有效性。在 try-catch 块中首先通过调用 jwtVerifier.verify(token) 方法对 JWT 进行验证。如果验证成功则返回一个 DecodedJWT 对象 verify其中包含了 JWT 的解码信息如令牌的唯一标识符ID和过期时间等。接着调用 deleteToken(verify.getId(), verify.getExpiresAt()) 方法来删除指定令牌并将其加入到黑名单中进行失效处理。这里使用了 verify 对象中的 ID 和过期时间作为参数。最后如果在验证 JWT 过程中发生了 JWTVerificationException 异常即 JWT 验证失败则捕获该异常并返回 false 表示令牌失效操作失败。 /*** 让指定Jwt令牌失效* param headerToken 请求头中携带的令牌* return 是否操作成功*/public boolean invalidateJwt(String headerToken){String token this.convertToken(headerToken);Algorithm algorithm Algorithm.HMAC256(key);JWTVerifier jwtVerifier JWT.require(algorithm).build();try {DecodedJWT verify jwtVerifier.verify(token);return deleteToken(verify.getId(), verify.getExpiresAt());} catch (JWTVerificationException e) {return false;}}
2.检查指定 UUID 的令牌是否为无效的已加入黑名单
这段代码用于检查指定 UUID 的令牌是否为无效的已加入黑名单通过判断 Redis 数据库中是否存在相应的键来决定令牌的有效性。如果键存在则表示令牌已失效如果键不存在则表示令牌仍然有效。 /*** 验证Token是否被列入Redis黑名单* param uuid 令牌ID* return 是否操作成功*/private boolean isInvalidToken(String uuid){return Boolean.TRUE.equals(template.hasKey(Const.JWT_BLACK_LIST uuid));}
3.将Token列入Redis黑名单中
这段代码实现了对指定令牌的删除和加入黑名单的操作用于管理令牌的有效性和安全性。
首先通过调用 isInvalidToken(uuid) 方法来检查指定的 UUID 是否为无效的令牌。如果 isInvalidToken 方法返回 true则说明该令牌无效此时直接返回 false不执行后续操作。获取当前时间 now然后计算令牌的过期时间与当前时间的差值并取最大值作为令牌的失效时间 expire。这里使用了 Math.max 方法来确保失效时间不会小于 0。最后通过 Redis 的 template 对象调用 opsForValue().set() 方法将指定 UUID 的令牌加入到名为 Const.JWT_BLACK_LIST uuid 的键中并设置过期时间为 expire 毫秒。这样就将该令牌加入到了黑名单中使其在一定时间后失效。最终方法返回 true 表示成功删除令牌并将其加入黑名单。 /*** 将Token列入Redis黑名单中* param uuid 令牌ID* param time 过期时间* return 是否操作成功*/private boolean deleteToken(String uuid, Date time){if(this.isInvalidToken(uuid))return false;Date now new Date();long expire Math.max(time.getTime() - now.getTime(), 0);template.opsForValue().set(Const.JWT_BLACK_LIST uuid, , expire, TimeUnit.MILLISECONDS);return true;}
public final class Const {//JWT令牌public final static String JWT_BLACK_LIST jwt:blacklist:;public final static String JWT_FREQUENCY jwt:frequency:;
}
对应完整的代码如下
Component
public class JwtUtils {Autowiredprivate StringRedisTemplate template;Value(${spring.security.jwt.key})String key;Value(${spring.security.jwt.expire})int expire;/*** 让指定Jwt令牌失效* param headerToken 请求头中携带的令牌* return 是否操作成功*/public boolean invalidateJwt(String headerToken){String token this.convertToken(headerToken);Algorithm algorithm Algorithm.HMAC256(key);JWTVerifier jwtVerifier JWT.require(algorithm).build();try {DecodedJWT verify jwtVerifier.verify(token);return deleteToken(verify.getId(), verify.getExpiresAt());} catch (JWTVerificationException e) {return false;}}/*** 将Token列入Redis黑名单中* param uuid 令牌ID* param time 过期时间* return 是否操作成功*/private boolean deleteToken(String uuid, Date time){if(this.isInvalidToken(uuid))return false;Date now new Date();long expire Math.max(time.getTime() - now.getTime(), 0);template.opsForValue().set(Const.JWT_BLACK_LIST uuid, , expire, TimeUnit.MILLISECONDS);return true;}/*** 验证Token是否被列入Redis黑名单* param uuid 令牌ID* return 是否操作成功*/private boolean isInvalidToken(String uuid){return Boolean.TRUE.equals(template.hasKey(Const.JWT_BLACK_LIST uuid));}public DecodedJWT resolveJwt(String headerToken) {String token this.convertToken(headerToken);if (token null) {return null;}Algorithm algorithm Algorithm.HMAC256(key);JWTVerifier jwtVerifier JWT.require(algorithm).build();try {DecodedJWT verify jwtVerifier.verify(token);if(this.isInvalidToken(verify.getId())) return null;Date expireAt verify.getExpiresAt();return new Date().after(expireAt) ? null : verify;} catch (JWTVerificationException e) {return null;}}public UserDetails toUser(DecodedJWT jwt) {MapString, Claim claims jwt.getClaims();return User.withUsername(claims.get(name).asString()).password(********).authorities(claims.get(authorities).asArray(String.class)).build();}public Integer toId(DecodedJWT jwt) {MapString, Claim claims jwt.getClaims();return claims.get(id).asInt();}public String createJwt(UserDetails details, int id, String username) {Algorithm algorithm Algorithm.HMAC256(key);Date expire this.expireTime();return JWT.create().withJWTId(UUID.randomUUID().toString()).withClaim(id, id).withClaim(name, username).withClaim(authorities, details.getAuthorities().stream().map(GrantedAuthority::getAuthority).toList()).withExpiresAt(expire).withIssuedAt(new Date()).sign(algorithm);}public Date expireTime() {Calendar calendar Calendar.getInstance();calendar.add(Calendar.HOUR, expire * 24);return calendar.getTime();}private String convertToken(String headerToken) {if(headerToken null || !headerToken.startsWith(Bearer )) {return null;}return headerToken.substring(7);}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923499.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!