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

这篇具有很好参考价值的文章主要介绍了巧用网关白名单实现接口免鉴权。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

分享技术,用心生活

场景描述:一般系统中提供的接口都是经过统一配置鉴权的,比如不登录不能访问。但是,一些接口是需要开放给客户用的,我称作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();

        // 白名单匹配,直接放行
        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();

        // 白名单匹配,直接放行
        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

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

  • GlobalFilter效果

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

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

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

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

3.2. 不在白名单内

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

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

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

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

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

当然,使用白名单也不仅仅局限于对外开放接口这个场景,也不仅仅局限于使用在鉴权过滤器上。这里只是一个抛砖引玉。实际需求可以结合自己的业务场景,使用不同的过滤器。文章来源地址https://www.toymoban.com/news/detail-620921.html

到了这里,关于巧用网关白名单实现接口免鉴权的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网关的鉴权与授权:实现安全的API访问控制

    API(Application Programming Interface,应用编程接口)是一种软件组件提供给其他软件组件使用的一种接口,它定义了如何访问某个功能或者数据集。API 提供了一种标准的方式来访问和操作数据,使得不同的系统和应用程序可以相互通信和协作。 随着微服务架构的普及,API 成为了企

    2024年04月14日
    浏览(32)
  • 【从0到1设计一个网关】基于JWT实现用户鉴权

    代码讲解链接 项目开源代码-点个star领取完整4w字开发文档 JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 JSON 对象。它通常用于在不同系统之间进行身份验证和授权,以及在各种应用中传递声明性信息。 JWT 由三部分组成,它们通过点号(

    2024年02月05日
    浏览(31)
  • GateWay网关自定义过滤器实现token校验完成统一鉴权

    gateWay---API网关,也可以称为业务网关,主要服务于微服务的; (1)  三大组件 路由(Route)         构建网关的基本模块,由id(唯一标示)、目标URI、一组断言、一组过滤器组成,如果断言为true,则匹配该路由   断言(Predicate)          可以使用它匹配来自HTTP请求的任何

    2024年02月08日
    浏览(38)
  • 5.微服务项目实战---Gateway--服务网关,实现统一认证、鉴权、监控、路由转发等

    大家都都知道在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用 这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。   这样的架构,会存在着诸多的问题: 客户端多次请求不同的微服务,

    2024年02月16日
    浏览(33)
  • 图片接口JWT鉴权实现

    之前做了个返回图片链接的接口,然后没做授权,然后今天键盘到了,也是用JWT来做接口的权限控制。 然后JTW网上已经有很多文章来说怎么用了,这里就不做多的解释了,如果不懂的可以参考下列链接的 文章。 图片接口文章:还在愁个人博客没有图片放? JTW参考: 画星星

    2024年02月07日
    浏览(32)
  • 对接第三方接口鉴权(Spring Boot+Aop+注解实现Api接口签名验证)

    一个web系统,从接口的使用范围也可以分为对内和对外两种,对内的接口主要限于一些我们内部系统的调用,多是通过内网进行调用,往往不用考虑太复杂的鉴权操作。但是,对于对外的接口,我们就不得不重视这个问题,外部接口没有做鉴权的操作就直接发布到互联网,而

    2024年04月29日
    浏览(65)
  • 微服务网关的鉴权功能

    1 网关如何整合openFeign完成统一鉴权 A 引入openFeign的依赖 B 注入user服务,@lazy注解解决循环依赖 C openFeign阻塞线程,网关非阻塞线程,所以改成 非阻塞 调用 D 加载优先级,提高全局过滤器优先级 E 整合httpMessageConverter F 鉴权 通过请求request中携带的token获取用户信息 G 传递鉴权

    2024年01月19日
    浏览(25)
  • satoken+ gateway网关统一鉴权 初版

    本博客内容 参考了satoken官网实现,satoken官网地址: https://sa-token.cc/doc.html#/micro/gateway-auth jinyi-gateway 网关服务 jinyi-user-service 用户服务 2.1 jinyi-user-api 2.2 jinyi-user-client 2.3 jinyi-user-provider jinyi-common 通用服务,定义了一些统一返回类,全局常量(R等) 项目层级关系截图: 3.1jinyi-

    2023年04月20日
    浏览(32)
  • SpringCloud网关Gateway认证鉴权【SpringCloud系列7】

    SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见。 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发 本文章是系列文章中的一篇 1、SpringCloud 项目基础工程搭建 【SpringCloud系列1】 2、S

    2024年02月09日
    浏览(37)
  • Spring Gateway + Oauth2 + Jwt网关统一鉴权

    之前文章里说过,分布式系统的鉴权有两种方式,一是在网关进行统一的鉴权操作,二是在各个微服务里单独鉴权。 第二种方式比较常见,代码网上也是很多。今天主要是说第一种方式。 重要前提:需要收集各个接口的uri路径和所需权限列表的对应关系,并存入缓存。 服务

    2024年02月03日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包