在 Spring Boot 库的上下文中添加新的 spring-security 链过滤器的预期方法

Posted

技术标签:

【中文标题】在 Spring Boot 库的上下文中添加新的 spring-security 链过滤器的预期方法【英文标题】:Intended way to add a new spring-securty chain Filter in the context of a spring boot library 【发布时间】:2022-01-08 05:57:39 【问题描述】:

我正在开发一个库,它引入了一个新的身份验证过滤器,应该在 spring-security 链中使用

我知道我可以通过以下方式添加过滤器:

@EnableResourceServer
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
class AmazingSecurityConfiguration extends WebSecurityConfigurerAdapter 
 
    // filter bean
    @Autowired 
    private MyFilter myFilter;

    @Override
    public void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests()
            // ... bunch of requirements per path
            // ... or ignore path "/bla"
            // etc.
            .anyRequest().authenticated();
        
        http.addFilterBefore(myFilter.getFilter(), 
            AbstractPreAuthenticatedProcessingFilter.class);
    

但是,这不适用于用户定义的配置。真的,我想在我的库 AutoConfigure 类中配置这个 bean,它是由 spring 工厂触发的。

在网上环顾四周,我看到他们自己扩展 WebSecurityConfigurerAdapter 类并让用户扩展此 new config 的示例。但我不知道这是否会阻止用户执行其他操作,并且它还依赖于用户首先调用 super.configure(http) 来加载过滤器。

这里的正确方法是什么?

【问题讨论】:

【参考方案1】:

我能够通过摆弄自动配置中 bean 的调用顺序来配置我自己的 http 配置

@Configuration
@ConditionalOnClass(WebSecurityConfigurerAdapter.class)
// Two annotations below ensure that this is not the only WebSecurityConfigurerAdapter,
// as it might otherwise disable security for the rest of the application

// The Order ensures that Spring default which uses ConditionalOnMissingBean is still configured before this class
@AutoConfigureOrder(Ordered.LOWEST_PRECEDENCE)
@ConditionalOnBean(WebSecurityConfigurerAdapter.class)
class LibraryFooSecurityConfig 

  @RequiredArgsConstructor
  @Configuration
  @Order(Ordered.HIGHEST_PRECEDENCE)
  class WebSecurityConfig extends WebSecurityConfigurerAdapter 

    // autowired in from elsewhere in the autoconfig
    private final MyFilter filter;

    @Override
    public void configure(HttpSecurity http) throws Exception 
      http
          .addFilterBefore(filter,
              AbstractPreAuthenticatedProcessingFilter.class);
    
  

这允许用户定义的安全配置扩展 WebSecurityConfigurerAdapter 并应用他们自己的规则,同时仍然允许我们的库在实际 spring-boot 应用程序之后添加它自己的项目 p>

【讨论】:

以上是关于在 Spring Boot 库的上下文中添加新的 spring-security 链过滤器的预期方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 应用程序中添加两个上下文路径

从 https 切换到 http 时登录后 spring-boot 用户会话未添加到上下文中

Spring Boot:在单元测试中用一个覆盖多个bean

Spring Boot:如何在运行时添加新的数据源

Spring Boot 向 Actuator 端点添加上下文路径

Spring Boot 全局控制器建议未在 Spring 上下文中加载