V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Augustine1128
V2EX  ›  程序员

springcloud gateway 针对某些路由跳过全局过滤器,有什么方法吗?

  •  
  •   Augustine1128 · 2020-07-21 20:44:34 +08:00 via Android · 2158 次点击
    这是一个创建于 1365 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请问各位大佬,springcloud gateway 针对某些路由跳过全局过滤器,有什么方法吗?

    网上看了一些方法,都是向请求的 attributes 里放参数,然后全局过滤器依据这些参数决定做不做鉴权,我觉得不太安全(恶意请求也可以向请求头里面放这些参数),请问有什么比较好的方法?

    13 条回复    2020-07-23 09:12:17 +08:00
    retanoj
        1
    retanoj  
       2020-07-21 20:48:36 +08:00 via iPhone
    所以,需求是正确嘛?
    Augustine1128
        2
    Augustine1128  
    OP
       2020-07-21 20:50:15 +08:00 via Android
    @retanoj 不太明白您的意思,您是说需求不合理吗?其实想做的就是除了注册登录,其他都要做鉴权。
    limuyan44
        3
    limuyan44  
       2020-07-21 21:12:12 +08:00
    可以采用针对某几个 url 进行拦截,未登录时,再怎么伪造请求,某些 url 都会校验的,至于登录之后一般都会存在某些 token 。
    Augustine1128
        4
    Augustine1128  
    OP
       2020-07-21 21:19:00 +08:00 via Android
    @limuyan44 这样就要在代码里把某些 url 写死?总感觉这样不够优雅😂
    StevenTong
        5
    StevenTong  
       2020-07-21 21:44:10 +08:00
    写两个 filter,一个用来全局移除前端传过来的 header,一个给指定路由加你要的 header,保证就算恶意请求过来携带了 header 也不管用。
    limuyan44
        6
    limuyan44  
       2020-07-21 21:51:34 +08:00
    @Augustine1128 配置写在配置中心或者配置文件是通常的作法,不存在硬编码在类中的情况。
    Augustine1128
        7
    Augustine1128  
    OP
       2020-07-21 22:52:15 +08:00 via Android
    @StevenTong 这个可以考虑一下
    Augustine1128
        8
    Augustine1128  
    OP
       2020-07-21 22:54:13 +08:00 via Android
    @limuyan44 好的,谢谢指点
    xuanbg
        9
    xuanbg  
       2020-07-22 09:11:00 +08:00
    写个 url 配置表放在 redis 里面,这个表搞一个是否验证的字段,过滤器根据这个字段来决定直接放行还是验证身份权限。如果访问的 url 都不存在表里面,就可以直接拦回去了。
    myCupOfTea
        10
    myCupOfTea  
       2020-07-22 15:35:40 +08:00
    获取配置
    @Component
    @ConfigurationProperties(prefix = "gateway")
    public class GatewayConfig {


    private String[] excludesUrls;

    public String[] getExcludesUrls() {
    return excludesUrls;
    }

    public void setExcludesUrls(String[] excludesUrls) {
    this.excludesUrls = excludesUrls;
    }
    }

    添加不鉴权的接口

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    http.headers().frameOptions().disable();
    http.csrf().disable()
    .authorizeRequests()
    .antMatchers("/test/**", "swagger-ui**").permitAll()
    .and().addFilterBefore(new TokenAuthFilter(permissionClient, redisService,
    new String[]{"/api/**"},
    excludesUrls.getExcludesUrls()),
    UsernamePasswordAuthenticationFilter.class);

    }

    当然 TokenAuthFilter 继承 GenericFilterBean 实现的

    不难的
    配置中心的配置文件

    gateway:
    excludesUrls:
    - /api/user/auth/**
    - /api/cms/content/editorUpload
    - /api/file/downloadFileByUri
    - /api/file/previewFileByUri
    StevenTong
        11
    StevenTong  
       2020-07-22 15:44:00 +08:00
    @myCupOfTea spring cloud gateway 是 webflux 的,security 也是 webflux security,跟你提供的代码实现上会有一些差别。楼主想跳过 gatewayfilter 吧,不是 securityfilter
    Augustine1128
        12
    Augustine1128  
    OP
       2020-07-23 00:43:11 +08:00 via Android
    @StevenTong 想跳过的其实是 globlefilter
    myCupOfTea
        13
    myCupOfTea  
       2020-07-23 09:12:17 +08:00
    @StevenTong 反正本质上就是读配置加 filter 就行了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1344 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:30 · PVG 01:30 · LAX 10:30 · JFK 13:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.