如何仅为一个特殊路径WebSecurityConfigurerAdapter添加过滤器

时间:2017-08-22 14:26:46

标签: java spring web-services security spring-security

我们的配置如下:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    public static final String LOGIN_PATH_EXPRESSION = "/login";
    public static final String API_PATH_EXPRESSION = "/api/**/*";
    public static final String GLOBAL_PATH_EXPRESSION = "/**/*";

    @Autowired
    @Qualifier("ssoFilter")
    private Filter ssoFilter;

    @Autowired
    private VerifyingProcessingFilter verifyingProcessingFilter;


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .userDetailsService(username -> new User(username, "", Collections.emptyList()))
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .authorizeRequests()
                .antMatchers(LOGIN_PATH_EXPRESSION)
                .authenticated()
                .and()
                .httpBasic()
                .and()
                .authenticationProvider(new SimpleAuthenticationProvider())
            .authorizeRequests()
                .antMatchers(API_PATH_EXPRESSION).authenticated()
                .and()
                .addFilterBefore(ssoFilter, BasicAuthenticationFilter.class)
                .addFilterAfter(verifyingProcessingFilter, FilteredOAuth2AuthenticationProcessingFilter.class)
            .authorizeRequests()
                .antMatchers(GLOBAL_PATH_EXPRESSION)
                .permitAll()
                .and()
                .csrf()
                .disable();
    }

并且认识到我们在FilteredOAuth2AuthenticationProcessingFilter电话中/login内部结束,并问自己为什么会这样。

目标是仅在使用路径ssoFilter命中端点时应用verifyingProcessingFilterapi/**/*

现在我们必须在过滤器内添加一个AntMatching检查,这样它才会应用于正确的请求,但我认为应该可以只将它添加到匹配的请求中。

有人可以举例说明如何将Filter添加到一个特定的Ant匹配路径请求中吗?

1 个答案:

答案 0 :(得分:16)

看起来您无法使用单个Configuration类执行此操作。看一下这个问题:How to apply spring security filter only on secured endpoints?

在这种情况下,我认为更好的解决方案是配置多个HttpSecurity。来自Spring IO documentation

  

我们可以像我们一样配置多个HttpSecurity实例   多个块。关键是扩展   WebSecurityConfigurationAdapter多次。例如,   以下是对URL进行不同配置的示例   以/ api /.

开头

文档中有一个完整的示例,其中包含完成此任务的必要步骤:

  
      
  1. 正常配置身份验证
  2.   
  3. 创建包含的WebSecurityConfigurerAdapter实例   @Order指定应该是哪个WebSecurityConfigurerAdapter   首先考虑。
  4.   
  5. http.antMatcher说明了这个HttpSecurity   仅适用于以/ api /
  6. 开头的网址   
  7. 创建WebSecurityConfigurerAdapter的另一个实例。如果URL不以/ api /开头,则将使用此配置。这个   在ApiWebSecurityConfigurationAdapter之后考虑配置   因为它在1之后有一个@Order值(没有@Order默认为最后一次)。
  8.   
祝你好运!