spring boot中的多个WebSecurityConfigureAdapter无法协同工作

rpppsulh  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(517)

我有一个spring启动应用程序。它有两个 WebSecurityConfigurerAdapter s、 其中一个在spring库依赖项中(这对于其他应用程序是通用的):

@Configuration
@EnableWebSecurity
@ComponentScan(basePackages = "com.mycomp.common.security.**")
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CommonWebSecurityConfig extends WebSecurityConfigurerAdapter {
  http

            .authorizeRequests()
    .antMatchers("/configurations/**").hasAnyAuthority(TechnicalScope.ACTUATOR_ADMIN.getValue(), SystemScope.ACTUATOR_ADMIN.getValue())
    .antMatchers(GET, "/jobs/scheduling/**").hasAuthority(TechnicalScope.JOB_READ.getValue())
    .antMatchers(GET, "/odata.svc/**").hasAuthority(TechnicalScope.ODATA_READ.getValue())

}

第二条:

@Configuration
@EnableWebSecurity
@ComponentScan(basePackages = "com.mycomp.accounts.**.security")
@Order(Ordered.HIGHEST_PRECEDENCE + 1)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  http

        .authorizeRequests()

            .mvcMatchers(GET, "/swagger-ui.html").permitAll()
            .mvcMatchers(GET, "/webjars/springfox-swagger-ui/**").permitAll()
            .mvcMatchers(GET, "/swagger-resources/**").permitAll()
            .mvcMatchers(GET, "/v2/api-docs/**").permitAll()

            .mvcMatchers(GET, AccountController.BASE_PATH).hasAuthority(Scope.ACCOUNT_READ.getValue())
            .mvcMatchers(PATCH, AccountController.BASE_PATH).hasAuthority(Scope.ACCOUNT_UPDATE.getValue())
    .and()
                .oauth2ResourceServer()
                .jwt()
                .jwtAuthenticationConverter(getJwtAuthoritiesConverter());

}

问题:根据第一个请求的匹配器验证请求 WebSecurityConfigurerAdapter 只是。忽略第二个匹配项。试着调试,我能看出来 FilterSecurityInterceptor.obtainSecurityMetadataSource 保持 requestMap 只有第一个配置器匹配器。
注:
当将第一个配置器的所有匹配器移到第二个配置器时,事情按预期进行。
两个配置程序在启动期间都会被扫描。
你知道为什么我们只考虑第一个配置者吗 FilterSecurityInterceptor ?

qgelzfjb

qgelzfjb1#

我想你错过了一个电话 requestMatchersCommonWebSecurityConfig .
尝试这样做:

@Configuration
@EnableWebSecurity
@ComponentScan(basePackages = "com.mycomp.common.security.**")
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CommonWebSecurityConfig extends WebSecurityConfigurerAdapter {
  http.requestMatchers()
    .antMatchers("/configurations/**").hasAnyAuthority(TechnicalScope.ACTUATOR_ADMIN.getValue(), SystemScope.ACTUATOR_ADMIN.getValue())
    .antMatchers(GET, "/jobs/scheduling/**").hasAuthority(TechnicalScope.JOB_READ.getValue())
    .antMatchers(GET, "/odata.svc/**").hasAuthority(TechnicalScope.ODATA_READ.getValue())
    .authorizeRequests();
}

这是java文档 requestMatchers :
允许指定在哪些httpservletrequest示例上调用此httpsecurity。此方法允许为多个不同的requestmatcher示例轻松调用httpsecurity。如果只需要一个requestmatcher,请考虑使用mvcmatcher(string)、antmatcher(string)、regexmatcher(string)或requestmatcher(requestmatcher)。调用requestmatchers()不会覆盖以前对mvcmatcher(string)}、requestmatchers()、antmatcher(string)、regexmatcher(string)和requestmatcher(requestmatcher)的调用。

相关问题