【问题标题】:Multiple Spring Security filters多个 Spring Security 过滤器
【发布时间】:2019-04-13 18:16:41
【问题描述】:

我有 2 个 Spring Security WebSecurityConfigurerAdapter 配置。我想使用过滤器 1 过滤对路径 /filter1 的所有请求,不包括 /filter1/filter2 路径。后一个我想用过滤器2过滤。我该如何实现呢?

过滤器 1 配置:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        .authorizeRequests()
            .antMatchers("filter1/filter2/**").permitAll()
            .and()
        .antMatcher("filter1/**")
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .addFilterBefore(filter1, FilterSecurityInterceptor.class);
}

过滤器 2 配置:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        .antMatcher("filter1/filter2/**")
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .addFilterBefore(filter2, FilterSecurityInterceptor.class);
}

【问题讨论】:

  • 您是否尝试过类似“filter1/{^(filter2)}/**”的第二个过滤器,只允许经过身份验证的请求?它基本上将正则表达式用于 filter2,但我不确定这是否完全受支持(尽管支持路径变量的正则表达式)。
  • 为什么?您想通过多个安全过滤器实现什么目标?
  • @M.Deinum 我想对每个 url 使用单独的身份验证。
  • @他不工作
  • 如果这是你想要的,你不需要单独的过滤器。从匹配路径的antMatcher 开始并配置它。

标签: spring spring-boot spring-security


【解决方案1】:

只需编写一个配置,按照它们应该匹配的方式对 url 进行排序(排序在这里很重要!)。

类似下面的东西

http
  .csrf().disable()
  .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
  .and()
        .authorizeRequests().anyRequest().authenticated()
   .and()
        .antMatcher("filter1/filter2/**")
        .addFilterBefore(filter2, FilterSecurityInterceptor.class)
        .antMatcher("filter1/**")
        .addFilterBefore(filter1, FilterSecurityInterceptor.class);

应该这样做。它将匹配最具体的一个并使用该过滤器链。不确定是否还需要将 .authorizeRequests().anyRequest().authenticated() 移动到每个映射。

【讨论】:

  • 唯一的是,如果已经触发了filter2,我不需要触发filter1。
  • 它没有。它将匹配特定的。第一个匹配的链将被执行。因此在这里订购很重要。
  • 我刚刚测试过,两个过滤器都被调用了。首先过滤器2,然后过滤器1。即使路径不匹配。可能是因为过滤器被定义为 spring bean。
  • 它们被调用是因为它们是正常过滤器链的一部分,而不仅仅是安全过滤器链。添加一个额外的FilterRegistrationBean 并使用它禁用过滤器(将enabled 属性设置为false)以防止它们在常规过滤器链中注册。
  • ` @Bean public FilterRegistrationBean filterRegistration(SecurityFilter filter2) { FilterRegistrationBean 注册 = new FilterRegistrationBean(filter2);注册.setEnabled(false);退货登记; } @Bean public FilterRegistrationBean filterRegistration2(SecurityFilter filter1) { FilterRegistrationBean 注册 = new FilterRegistrationBean(filter1);注册.setEnabled(false);退货登记; } ` 我已经有了。仅当我访问 filter1 或 filter2 路径时才调用它们。
猜你喜欢
  • 2011-10-29
  • 2018-07-08
  • 2012-01-30
  • 2017-05-19
  • 2019-10-01
  • 2016-06-24
  • 2013-04-13
  • 2015-07-23
  • 2016-03-11
相关资源
最近更新 更多