GateWay+JWT
2023-10-26 15:34:11 0 举报
AI智能生成
GateWay+JWT实现网关鉴权
作者其他创作
大纲/内容
JWT工具类
私有的静态常量字符串:secret
生成token方法
1、获取当前时间:
LocalDateTime now = LocalDateTime.now();
Date nowDate = LocalDateTimeUtil.transferToDate(now);
LocalDateTime now = LocalDateTime.now();
Date nowDate = LocalDateTimeUtil.transferToDate(now);
2、新建JwtBuilder:
JwtBuilder builder =
Jwts.builder().setHeaderParam("typ", "JWT");
JwtBuilder builder =
Jwts.builder().setHeaderParam("typ", "JWT");
3、给builder赋属性值
1、用户属性,存放于Map集合中:
builder.setClaims(claims);
builder.setClaims(claims);
2、设置过期时间:
LocalDateTime expiration = now.plusMinutes(expireMinutes);
Date expirationDate = LocalDateTimeUtil.transferToDate(expiration);
builder.setExpiration(expirationDate);
LocalDateTime expiration = now.plusMinutes(expireMinutes);
Date expirationDate = LocalDateTimeUtil.transferToDate(expiration);
builder.setExpiration(expirationDate);
3、设置其他值:
builder.setSubject(subject)// 设置面向用户
.setIssuedAt(nowDate)// 设置签发时间
.signWith(SignatureAlgorithm.HS512, secret);//签名哈希
builder.setSubject(subject)// 设置面向用户
.setIssuedAt(nowDate)// 设置签发时间
.signWith(SignatureAlgorithm.HS512, secret);//签名哈希
4、最后返回token字符串:
return builder.compact();
return builder.compact();
从令牌中获取数据声明
从Jwts中获取对应token的Body:
claims =Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
claims =Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
获取token的剩余过期时间,单位:毫秒
Date expiration = getClaimByToken(token).getExpiration();
if(null!=expiration){
result = expiration.getTime() - System.currentTimeMillis();}
result = expiration.getTime() - System.currentTimeMillis();}
统一入口:GlobalFilter
1、获取url判断是否在白名单请求内
String url = request.getURI().getPath();
// 跳过不需要验证的路径
if (StringUtils.matches(url, ignoreWhite.getWhites())) {
return chain.filter(exchange);
}
// 跳过不需要验证的路径
if (StringUtils.matches(url, ignoreWhite.getWhites())) {
return chain.filter(exchange);
}
2、从Headers()中获取到对应的token,并裁剪掉前缀
3、获取用户信息
Claims claims = JwtUtils.getClaimByToken(token);
4、获取到redis中的key,从redis中获取用户信息
1、key的获取:标识符+token
2、从redis中获取用户信息:redisUtils.get(key)
5、判断下是否是当前用户userid,如果不是,提示登陆状态过期
boolean isLogin = userid.equals(userVo.getId());
if (!isLogin) {
return unauthorizedResponse(exchange, "登录状态已过期");}
if (!isLogin) {
return unauthorizedResponse(exchange, "登录状态已过期");}
6、如果是当前用户则将redis过期时间重新设置为30min
redisUtils.expire(前缀+token, 36000, TimeUnit.SECONDS);
redisUtils.expire(前缀+userid, 36000, TimeUnit.SECONDS);
redisUtils.expire(前缀+userid, 36000, TimeUnit.SECONDS);
7、获取应用子系统appcode
exchange.getRequest().getHeaders().getFirst("appcode");
8、判断redis中是否存在子系统appcode,存在的话就expire时间,不存在就set
9、设置请求头中的userid,并移除掉请求头的中from-source
0 条评论
下一页