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