Java Spring Boot中的多个Web安全配置类筛选器调用

Java Spring Boot中的多个Web安全配置类筛选器调用,java,spring,rest,spring-boot,spring-security,Java,Spring,Rest,Spring Boot,Spring Security,我在Spring boot 1.3.6项目中有一个SecurityConfig类,我在HttpSecurity上应用了一个过滤器 像下面这样 @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) @Order(1) public class SecurityConfiguration extends WebSecurityConfigu

我在Spring boot 1.3.6项目中有一个SecurityConfig类,我在HttpSecurity上应用了一个过滤器

像下面这样

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
@Order(1)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Inject
    private TokenProvider tokenProvider;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
            .disable()
            .headers()
            .frameOptions()
            .disable()
        .and()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
            .authorizeRequests()

            .antMatchers("/api/logs/**").hasAuthority(AuthoritiesConstants.ADMIN)
            .antMatchers("/api/**").permitAll())
        .and()
            .apply(securityConfigurerAdapter());

    }

    private JWTConfig securityConfigurerAdapter() {
        return new JWTConfig(tokenProvider);
    }   
}


public class JWTConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {

    private TokenProvider tokenProvider;

    public JWTConfig(TokenProvider tokenProvider) {
        this.tokenProvider = tokenProvider;
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        JWTFilter customFilter = new JWTFilter(tokenProvider);
        http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);
    }
}
当应用程序启动时,我可以看到外部jar的SecurityConfig类首先点击并注册过滤器,然后是项目的SecurityConfig get invoke并注册JWTFilter。但在后一个过滤器注册之后,当我检查HttpSecurity filters字段时,它只包含JWTFilter


在使用不同的SecurityConfig注册所有筛选器之后,我是否可以让所有筛选器在同一个HttpSecurity筛选器中注册?

@dur问题是,如果我想将外部jar的筛选器添加代码移动到我的项目中,我有许多依赖项,还需要在我的项目安全配置类中重新自动连接。这些在示例代码中没有提到。所以我在考虑注册HttpSecurity过滤器的方法,它通过使用configure(HttpSecurity http)从我的项目和外部库中添加,谢谢@dur。是的,我想保持两个配置。因此,在查看您的答案的同时,我认为我必须将外部库中的过滤器注册移到我的项目中,并将其添加到另一个SecurityConfigureAdapter中,如您的答案所示。看起来我必须在这里再次注入依赖项和其他代码。
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Override
    public void configure(final WebSecurity webSecurity) throws Exception {
        webSecurity.ignoring().antMatchers(HttpMethod.GET, "/health").antMatchers(HttpMethod.OPTIONS, "/**");
    }

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http.addFilterBefore(getTokenAuthenticationFilter(), BasicAuthenticationFilter.class);
        http.addFilterAfter(getCorrelationIdFilter(), getTokenAuthenticationFilter.class);
        http.csrf().disable().authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll();
    }

    private TokenAuthenticationFilter getTokenAuthenticationFilter() {
        return new TokenAuthenticationFilter();

    }
}