springcloud alibaba gateway网关鉴权

登录鉴权:在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);
    }
posted @ 2024-04-18 13:16  zhuoyb  阅读(274)  评论(0)    收藏  举报