【问题标题】:Can't use WebSecurityConfigurerAdapter in a custom spring boot starter无法在自定义 Spring Boot 启动器中使用 WebSecurityConfigurerAdapter
【发布时间】:2021-06-01 23:28:55
【问题描述】:

我正在尝试通过定义从WebSecurityConfigurerAdapter 扩展的配置类,为我的自定义安全配置(LDAP + JWT)创建自己的 Spring Boot 启动器。但是,当我使用这个启动器启动我的应用程序时,我得到:

IllegalStateException: Found WebSecurityConfigurerAdapter as well as SecurityFilterChain.
Please select just one.

由于this issue of the spring security,我发现不再可能这样做。 spring的WebSecurityConfiguration中有一个断言:

我解决了这个问题在启动器中添加了以下内容(根据问题):

@Bean
@Order(1) //Explanation for this below
open fun filterChain(http: HttpSecurity, jwtHelper: JwtHelper): SecurityFilterChain {
    return http.authorizeRequests()
           ...
               .addFilterBefore(JwtAuthenticationFilter(jwtHelper), UsernamePasswordAuthenticationFilter::class.java)
               .and().build()
}

@Bean
open fun authenticationProvider(ldapConfig: LdapConfig): ActiveDirectoryLdapAuthenticationProvider {
    return ActiveDirectoryLdapAuthenticationProvider(...)
}

我添加了@Order(1),因为有两个securityFilterChains:我的(在上面的配置中定义),另一个来自未知来源。我想,后者是无法使用WebSecurityConfigurerAdapter的原因。

主要问题是我找不到它的来源。


来自WebSecurityConfiguration的断点...以防万一:

我假设,因此我不能使用@EnableGlobalMethodSecurity(prePostEnabled = true) 也是。它说:

Cannot apply org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration$EnableGlobalAuthenticationAutowiredConfigurer
to already built object

这是我的依赖项列表:

  1. 启动器使用的带有模型的模块(名称:my-ldap-security-model):
dependencies {
    compileOnly 'org.springframework.security:spring-security-core'
    compileOnly 'org.springframework:spring-web'
    compileOnly 'javax.servlet:javax.servlet-api'
    api 'jakarta.xml.bind:jakarta.xml.bind-api'
    api 'org.glassfish.jaxb:jaxb-runtime'
    api 'io.jsonwebtoken:jjwt'
}
  1. 启动器使用的带有模型的模块(名称:my-ldap-security-spring-boot-starter):
dependencies {
    compile project(':my-ldap-security-model')
    compileOnly 'javax.servlet:javax.servlet-api'
    api 'org.springframework.security:spring-security-core'
    api 'org.springframework.security:spring-security-config'
    api 'org.springframework.security:spring-security-web'
    api 'org.springframework:spring-web'
    api 'org.springframework.security:spring-security-ldap'
}
  1. 应用项目:
dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
    implementation('com.demo.boot:my-ldap-security-spring-boot-starter:0.0.1')
}

请帮我找出那个过滤器的根。

【问题讨论】:

标签: java spring spring-boot spring-security


【解决方案1】:

最初,如果有任何WebSecurityConfigurerAdapter,默认的SecurityFilterChain 将被禁用。但是,如果 spring security 自动配置的优先级高于 WebSecurityConfigurerAdapter 的自动配置,则它不起作用。

解决方案:我在自动配置类上方添加了@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)。不再有默认的安全过滤器链:)

关于@EnableGlobalMethodSecurity... 这是关于缓存的。突然,它被修复了。

【讨论】:

    【解决方案2】:

    看一下项目结构,可能有一个来自 xml 配置而不是类扩展的 securityFilterChain。带有 http 标签的 XML。

    【讨论】:

      猜你喜欢
      • 2020-03-21
      • 2019-08-30
      • 1970-01-01
      • 2014-11-24
      • 2014-02-14
      • 2022-01-24
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多