无法定义以keycloak开头的属性

6
无法定义以“keycloak”开头的属性。如果keycloak-spring-boot-starter starter jar观察到不在其范围内的keycloak属性,则无法加载这些属性。如果我们在属性前缀加上“sso”,问题就会得到解决。是否有一种方法可以避免此错误,即使保留keycloak前缀?
keycloak.admin.username=
keycloak.admin.password=

sso.keycloak.admin.username=
sso.keycloak.admin.password=

这是在使用Spring Boot 2.5.0和Keycloak 13.0.0时出现的错误。

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is java.lang.NullPointerException
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653)
        ... 21 more
Caused by: java.lang.NullPointerException
        at org.springframework.security.config.annotation.web.builders.HttpSecurity.addFilterAtOffsetOf(HttpSecurity.java:2654)
        at org.springframework.security.config.annotation.web.builders.HttpSecurity.addFilterAfter(HttpSecurity.java:2645)
        at org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter.configure(KeycloakWebSecurityConfigurerAdapter.java:123)
        at com.foo.config.KeycloakSecurityConfig.configure(KeycloakSecurityConfig.java:36)
        at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.getHttp(WebSecurityConfigurerAdapter.java:217)
        at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.init(WebSecurityConfigurerAdapter.java:315)
        at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.init(WebSecurityConfigurerAdapter.java:93)
        at com.foo.config.KeycloakSecurityConfig$$EnhancerBySpringCGLIB$$501f46fb.init(<generated>)
        at org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder.init(AbstractConfiguredSecurityBuilder.java:338)
        at org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder.doBuild(AbstractConfiguredSecurityBuilder.java:300)
        at org.springframework.security.config.annotation.AbstractSecurityBuilder.build(AbstractSecurityBuilder.java:38)
        at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.springSecurityFilterChain(WebSecurityConfiguration.java:127)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
2个回答

6

这个错误是在 Spring Security 的版本5.5.0中引入的,它随着Spring Boot 2.5.0一起发布。

这是由于 KeyCloak 连续添加了两个过滤器,像这样:

@Override
protected void configure(HttpSecurity http) throws Exception {
        http
                ...
                .addFilterAfter(keycloakSecurityContextRequestFilter(), SecurityContextHolderAwareRequestFilter.class)
                .addFilterAfter(keycloakAuthenticatedActionsRequestFilter(), KeycloakSecurityContextRequestFilter.class)
                ...
}

目前存在一个bug,即自定义过滤器的顺序没有被保留,因此会在尝试添加相对于最近添加的其他自定义过滤器时导致NullPointerException

我建议您现在使用Spring Boot的较低版本,例如2.4.x,直到GitHub上的问题得到解决为止。


0
从Keycloak的代码来看,它们将属性硬编码为特定属性。
从KeycloakSpringBootProperties
/* 这是一个虚拟属性,用于避免在使用Spring Cloud时重新绑定属性keycloak.config.resolver的问题 - 请参阅KEYCLOAK-2977 */
从他们的代码来看,似乎我们可以利用他们提供的解决方法来包含额外的属性。 但要做到这一点,我们必须在其中添加'config'。
keycloak.config.admin.username=asd
keycloak.config.admin.password=sss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接