gpt4 book ai didi

spring-boot - Spring 安全 OAuth2 : how to add multiple Security Filter Chain of type ResourceServerConfigurer?

转载 作者:行者123 更新时间:2023-12-05 03:03:26 27 4
gpt4 key购买 nike

我使用 Spring Security OAuth2 设置了一个 Spring Boot 多模块(5 个模块)应用程序。一切正常,但随着应用程序的增长,我想将每个模块中的安全部分分开。主模块启用一切:

@SpringBootApplication
@EnableResourceServer
@EnableAuthorizationServer
@EnableWebSecurity(debug = true)
public class Application {
...
}

现在在每个模块中我都定义了一个 ResourceServerConfigurer 类型的 bean

@Configuration
@Order(2)
public class Module1SecurityFilterChain extends ResourceServerConfigurerAdapter {

@Override
public void configure( HttpSecurity http ) throws Exception {
http.sessionManagement().sessionCreationPolicy( STATELESS );
http.antMatcher( "/module1/**")
.authorizeRequests()
.antMatchers( "/module1/resource").authenticated()
.antMatchers( "/module1/test" ).authenticated()
.anyRequest().access( "#oauth2.hasScope('webclient')" );
}
}

与模块 2 相同:

@Configuration
@Order(1)
public class Module2SecurityFilterChain extends ResourceServerConfigurerAdapter {

@Override
public void configure( HttpSecurity http ) throws Exception {
http.sessionManagement().sessionCreationPolicy( STATELESS );
http.antMatcher( "/module2/**")
.authorizeRequests()
.antMatchers( "/module2/resource").authenticated()
.antMatchers( "/module2/test" ).authenticated()
.anyRequest().access( "#oauth2.hasScope('webclient')" );
}
}

等等……

问题是只有一个 FilterChain 被注册了,那个带有 @Order(2) 的。我看了一下 doc ResourceServerConfigurer 的声明如下:

... if more than one configures the same preoperty, then the last one wins. The configurers are sorted by Order before being applied

我怎样才能继续绕过这个限制?非常感谢。

编辑

这样做(扩展 WebSecurityConfigurerAdapter 而不是 ResourceServerConfigurerAdapter):

@Configuration
@Order(1)
public class Module2SecurityFilterChain extends WebSecurityConfigurerAdapter {...}

似乎注册了过滤器链,但还有另一个问题,当我对用户进行身份验证时(在 /oauth/token 上获取 token )我无法访问受此链保护的资源,我得到了403 禁止访问。这个黑匣子是如何工作的?

最佳答案

您可以使用 requestMatchers().antMatchers(String...) 跨多个 bean 配置多个匹配器,如下所示:

@Configuration
public class Module2SecurityFilterChain extends ResourceServerConfigurerAdapter {

@Override
public void configure(HttpSecurity http) throws Exception {
http
.requestMatchers()
.antMatchers("/module2/**")
.authorizeRequests()
.antMatchers("/module2/resource").authenticated()
.antMatchers("/module2/test").authenticated()
.anyRequest().access("#oauth2.hasScope('webclient')");
}
}

这有点令人困惑,但是当您调用 http.antMatcher(String) 时,这表明您只想匹配那个端点。因此,调用它两次(一次在 Module1SecurityFilterChain 中,然后在 Module2SecurityFilterChain 中再次调用),第二次调用覆盖第一次调用。

但是,使用 http.requestMatchers().antMatchers(String) 表示给定的 String 应该添加到已经匹配的现有端点列表中。您可以将 antMatcher 想象成有点像“setMatcher”,将 antMatchers 想象成“appendMatcher”。

关于spring-boot - Spring 安全 OAuth2 : how to add multiple Security Filter Chain of type ResourceServerConfigurer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53999591/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com