我有一个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
?
1条答案
按热度按时间qgelzfjb1#
我想你错过了一个电话
requestMatchers
在CommonWebSecurityConfig
.尝试这样做:
这是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)的调用。