无法在自定义spring启动程序中使用WebSecurity配置器适配器

7gcisfzg  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(1959)

我正试图通过定义扩展自的配置类,为我的自定义安全配置(ldap+jwt)创建自己的spring启动程序 WebSecurityConfigurerAdapter . 但是,当我使用此初学者启动应用程序时,我得到:

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

我发现,这是不可能再这样做,因为这个问题的 Spring 安全。spring的WebSecurity配置中有一个Assert:

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

@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

以下是我的依赖项列表:
具有初学者使用的模型的模块(名称: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'
}

具有starter使用的型号的模块(名称: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'
}

应用程序项目:

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
    implementation('com.demo.boot:my-ldap-security-spring-boot-starter:0.0.1')
}

请帮我找出过滤器的根。

ckx4rj1h

ckx4rj1h1#

最初,默认值 SecurityFilterChain 如果有,则禁用 WebSecurityConfigurerAdapter . 但是,如果spring-security自动配置的优先级高于使用 WebSecurityConfigurerAdapter .
解决方案:我补充道 @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10) 在自动配置类之上。不再有默认的安全筛选器链:)
关于 @EnableGlobalMethodSecurity ... 是关于储藏室的。突然,它修好了。

相关问题