登录鉴权:在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);
}