首页 > 其他分享 >巧用网关白名单实现接口免鉴权

巧用网关白名单实现接口免鉴权

时间:2023-07-28 09:22:41浏览次数:50  
标签:网关 exchange 接口 gateWayProperties 白名单 免鉴权 过滤器

分享技术,用心生活

场景描述:一般系统中提供的接口都是经过统一配置鉴权的,比如不登录不能访问。但是,一些接口是需要开放给客户用的,我称作open API。那么这时候你不能要求客户先登录你的接口再去调用吧。那么,这时候就可以通过网关白名单来实现免鉴权

先说思路:

  1. 配置网关白名单列表
  2. 编写鉴权过滤器
  3. 过滤器中读取白名单
  4. 业务处理

简单的时序图

时序图

注: 如果使用的是网关过滤器,在校验后应该再次过滤器,也就是经过2次;注意区别(网关过滤器具有前置pre、后置post两次过滤,细节不在此处详细探讨)。

过滤器普遍用于处理拦截,校验,改写,日志等场景;通过白名单来控制鉴权,正契合过滤器的作用。

1. 配置网关白名单

在你的本地的配置文件或者是nacos的配置文件中新增以下配置

可以配置url全路径,也可以配置前缀路径

gateway:
  whitelist:
    - /user/api/userInfo/query
    - /open/oss/upload
    - /open/vod/api

2. 过滤器配置

过滤器你可以选择用spring的WebFilter,如果你的系统集成了gateway也可以使用网关过滤器,然后自定义过滤器实现GlobalFilter

2.1. WebFilter实现

@Component
@RequiredArgsConstructor
public class AuthFilter implements WebFilter, Ordered {

    private final GateWayProperties gateWayProperties;

    private static final AntPathMatcher pathMatcher = new AntPathMatcher();

    @Override
    public int getOrder() {
        return 1;
    }

    @Override
    protected Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String urlMethod = request.getURI().getPath() + request.getMethodValue();

        // 白名单匹配,直接放行
        for (String pattern : gateWayProperties.getWhitelist()) {
            if (pathMatcher.matchStart(pattern, urlMethod)) {
                return chain.filter(exchange);
            }
        }
       // 未匹配到
       // 鉴权逻辑,此处省略....
    }

}

2.2. 网关GlobalFilter实现

@Component
@RequiredArgsConstructor
public class AuthFilter implements GlobalFilter, Ordered {

    private final GateWayProperties gateWayProperties;

    private static final AntPathMatcher pathMatcher = new AntPathMatcher();


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String urlMethod = request.getURI().getPath() + request.getMethodValue();

        // 白名单匹配,直接放行
        for (String pattern : gateWayProperties.getWhitelist()) {
            if (pathMatcher.matchStart(pattern, urlMethod)) {
                return chain.filter(exchange);
            }
        }
        // 未匹配到,忽略鉴权逻辑,直接设置401
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        return exchange.getResponse().setComplete();
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

2.3. 读取白名单配置

GateWayProperties中的prefix和配置文件中的名称一致

@Getter
@Setter
@ToString
@ConfigurationProperties(prefix = "gateway")
public class GateWayProperties implements Serializable {

    private static final long serialVersionUID = 1L;

    private List<String> whitelist;

}

3. 演示效果

使用上面配置的查询用户信息接口/user/api/userInfo/query做演示

3.1. 在白名单内

  • WebFilter效果

查看断点gateWayProperties中白名单列表已获取到,且比对结果为true

WebFilter

  • GlobalFilter效果

查看断点gateWayProperties中白名单列表也已获取到,且比对结果为true

GlobalFilter

查询结果:已获取到用户信息

结果

3.2. 不在白名单内

我们把接口/user/api/userInfo/query从白名单中删除,用网关过滤器演示。

查看断点gateWayProperties中白名单列表已没有查询用户接口,且返回了401

GlobalFilter

查询结果:http状态码是我们设置的401

结果

当然,使用白名单也不仅仅局限于对外开放接口这个场景,也不仅仅局限于使用在鉴权过滤器上。这里只是一个抛砖引玉。实际需求可以结合自己的业务场景,使用不同的过滤器。

本文由mdnice多平台发布

标签:网关,exchange,接口,gateWayProperties,白名单,免鉴权,过滤器
From: https://www.cnblogs.com/douzige/p/17586722.html

相关文章

  • ETHERNET/IP转PROFIBUS-DP网关EtherNet/IP与Profibus DP通讯网关
    大家好,今天要给大家介绍一款非常神奇的通讯网关捷米特JM-DPM-EIP!这款产品可以将各种PROFIBUS-DP从站接入到ETHERNET/IP网络中,真是一款神奇的产品啊!你是否想过,如果没有这款产品,PROFIBUS-DP从站和ETHERNET/IP网络之间该怎么通讯呢?让我们来看看这款产品到底有哪些神奇之处吧! 这款......
  • Profinet转EtherNet/IP网关连接AB PLC的应用案例
    西门子S7-1500PLC(profinet)与ABPLC以太网通讯(EtherNet/IP)。本文主要介绍捷米特JM-EIP-PN的Profinet转EtherNet/IP网关,连接西门子S7-1500PLC与ABPLC 通讯的配置过程,供大家参考。1, 新建工程:运行 RSLogix5000 程序,选择菜单 File->New,弹出对话框:  2, 在“Type”中选......
  • N1 刷入 openwrt 作旁路网关的一些杂事
    前言我宿舍原先的网络环境是这样的,一台最新原厂固件的红米ac2100作主路由,一台n1刷入了flippy的openwrt(版本很旧,大约是54+o)作为透明代理(又称旁路网关、旁路由),本来本着能用就不动的原则,虽然一直有小毛病,但只是偶尔折腾一下,没解决又放弃了。问题描述但是这两天,碰到了一个......
  • 监测数据多又散,有水质监测网关,再复杂也不怕
    “绿水青山就是金山银山,随着国家在环保领域的持续发力,水作为环境监管极其重要的一极,尤其是河湖水系的监管,也越来越严格,监测布点密度不断加大。水质自动监测站作为河湖断面监测和水质判断比较权威的工具,如何降低其建设成本和集成门槛是很多集成商比较关注的问题。”海洋、河道水质......
  • 关于AWS-实现私有子网中的EC2-通过NAT网关访问外网的过程及原理
    在AWS中,公有子网中的主机之所以能访问互联网,其原理是借助于子网所在VPC中的IGW那么私有子网中的主机,如EC2,应该如何访问外网/互联网呢?其实是可以通过NATGateway实现笔者先简单总结一下,核心的操作步骤如下:1、先得有一个IGW,绑定到VPC之中,这样IGW就与VPC有了关联的关系2、至少得......
  • EtherNet/IP转 Modbus网关实现AB PLC控制变频器案例
    捷米特JM-EIP-RTU网关Modbus转ETHERNET/IP用于将多个变频器连接到Ethernet/Ip主网,以便森兰变频器可以由ABPLC控制。 配备专用于JM-EIP-RTU网关的EDS文件,ABPLC主站可以控制森兰逆变器从站。使用 AB 系统的配置方法1,运行 RSLogix5000 程序加载捷米特JM-EIP-RTU的EDS ......
  • 智能网关嵌入公园智能系统,安全又稳定
    景区环境监测系统采用先进的物联网网关,实现对各监测单元数据的采集、存储、传输和管理,主要对景点的气象要素、空气质量、水文变化、地质信息、雷电危害等进行监测,是一个集气象预警、在线监控等多种功能于一体的现代化综合系统。系统介绍本系统采用标准485接口,可将传感器,摄像头等检......
  • MODBUS RTU转 EtherNet/IP 网关连接森兰变频器与欧姆龙系统通讯配置案例
    捷米特JM-EIP-RTU(Modbus转Ethernet/Ip)网关,用于将多个 MODBUS 从站设备接入 ETHERNET/IP 主站网络,实现 MODBUS 转 ETHERNET/IP 功能。配上 捷米特JM-EIP-RTU网关专用的 EDS 文件,实现 ETHERNET/IP 主 站对 MODBUS 从站设备的控制。 使用欧姆龙系统的配置方法1......
  • CCLINK转profinet网关cclink profibus
    在工业自动化领域,不同品牌的PLC控制系统之间的数据交互是一个重要的问题。比如说,如果我们需要将三菱PLC的数据和西门子PLC的数据进行交互,我们应该如何处理呢?在这方面,捷米的JM-PN-CCLK通讯网关为我们提供了一种解决方案。捷米的JM-PN-CCLK通讯网关是一款自主研发的PROFINET从站功......
  • iptables——黑白名单机制
    黑名单机制当链的默认策略设置为ACCEPT时,按照道理来说,在链中配置规则时,对应的动作应该设置为DROP或者REJECT。因为,默认策略已经为ACCEPT了,如果在设置规则时,对应动作仍然为ACCEPT,那么所有报文都会被放行,因为不管报文是否被规则匹配到都会被ACCEPT,所以就失去了访问控制的意义。所......