登录鉴权:在gateway网关中实现全局过滤器GlobalFilter以及拦截器的顺序Ordered,在nacos中配置好需要放行的路径(如登录/login),获取请求头中的用户id,组装reids的key,来redis中存放的value,即token,再获取请求头中的token来跟redis中的value值进行比对,一致则放行,否则抛出异常。
核心代码如下:
点击查看代码
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();URI uri = request.getURI();String url = uri.getPath();log.info("请求url:{}", url);if (this.urlIsWhiteList(url)) {return chain.filter(exchange);}String token = exchange.getRequest().getHeaders().getFirst(HttpHeaders.AUTHORIZATION);String userId = exchange.getRequest().getHeaders().getFirst(RedisConstant.HEADER_USERID);if (StrUtil.isEmpty(token) || StrUtil.isEmpty(userId)) {log.error("请求参数未检索到token和用户Id,授权不予通过,当前登录Id={}", userId);throw new BizException("未检索到token和用户Id,授权不予通过");}String tokenValue = redisTemplate.opsForValue().get(RedisConstant.AUTH_TOKEN_PREFIX + userId);if (!(StrUtil.equals(token, tokenValue))) {log.error("token与缓存不匹配,授权不予通过,当前登录Id={}", userId);throw new BizException("token与缓存不匹配,授权不予通过");}//获取用户ip存放到redis里getUserIpSetRedis(request, userId);//调用chain.filter继续向下游执行return chain.filter(exchange);}