当前位置: 首页 > 知识库问答 >
问题:

Spring Security OAuth2:如何添加ResourceServerConfigurer类型的多个安全筛选器链?

伯鸿达
2023-03-14

我用Spring Security Oauth2建立了一个Spring Boot多模块(5个模块)应用程序。所有的工作都很好,但是随着应用程序的不断增长,我希望将每个模块中的安全部分分开。主模块支持所有功能:

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

现在,在每个模块中,我定义了ResourceServerConfigureer类型的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')" );
   }
}
@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)。我查看了ResourceServerConfigureer的文档,它指出:

...如果多个配置相同的preoperty,则最后一个获胜。配置程序在应用之前按顺序排序

我怎样才能绕过这个限制呢?多谢.

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

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

共有1个答案

邵浩大
2023-03-14

您可以通过使用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)时,这意味着您只想针对一个endpoint进行匹配。因此,调用它两次(一次在Module1SecurityFilterChain中,然后在Module2SecurityFilterChain)时,第二次调用将覆盖第一次调用。

但是,使用http.requestmatchers().antmatchers(String)指示应将给定的String添加到已匹配的现有endpoint列表中。您可以认为antmatcher有点像“setmatcher”,而antmatcher像“appendmatcher”。

 类似资料:
  • 首先,我试图使选择所有复选框,如果我单击表头中的选择所有复选框,整个表行将选择并显示一个复选框反向消息,即我选择了多少复选框。这里的问题是,如果我单击select all复选框,反向消息不会显示楼上的表,即我选择了多少行。 其次,如果我从任何列中筛选任何数字,相同的数字将显示同一列中有多少行具有相同的数字。如果我选中了所有复选框,那么反向消息将显示我选中了多少行复选框。这里,问题是显示整个表行计数

  • 注意:“else”语句只是出于测试目的,似乎表明if语句没有正常工作,因为当我测试时,它总是被触发。

  • 我尝试创建另一个FilterChainProxy bean,在其链列表中包含上述两个过滤器,并将该bean作为自定义过滤器添加到之前的名称空间配置中,过滤器似乎可以工作,但我的JSF导航中断了,特别是在commandLink中(我认为使用此FilterChainProxy时AJAX调用失败) 有没有人可以就如何将这两个过滤器和可能的其他过滤器添加到Spring Security过滤器链提出任何想法

  • 问题内容: 在纯postgres中,我们可以编写: 或者 没有原始sql的情况下如何在sqlalchemy的帮助下进行相同的操作? 问题答案: 等于1。 因此,您可以使用该方法。 我不记得曾经使用PostgreSQL多年。你? 如果您要处理 数组列, 并想测试该 列中 是否包含给定元素(或给定数组的所有元素),则可以利用PostgreSQL数组运算符 ()或更合适地利用反同级 ()。 数组运算符的

  • 我试图创建一个安全过滤器,以排除某些用户在ElasticSearch中看到某些文档。例如,如果一个文档包含“abc:123”和“abc:xyz”,那么用户的配置文件中必须同时包含这两个文档才能查看该文档。我们正在使用小胡子模板创建这个动态。我的第一次尝试是这样的: 但是,我很快意识到,这将允许拥有一个控件的用户查看具有多个控件的文档。文档必须具有用户必须匹配的控件的子集。因此,如果用户只有“abc

  • 我正在寻找一种非侵入性的方式来为某些api调用添加验证码过滤器。 我的安装程序由两个组成,每个具有一个筛选器(不 内部api(“/iapi”对所有调用使用筛选器A,但也忽略某些公共请求,如/authenticate) 外部api(“/eAPI”对所有调用使用筛选器B) 如何在Spring Security材料之前,在公共、内部api或外部api调用上添加过滤器?我不需要SecurityContex