无法定义以 keycloak 开头的属性

Posted

技术标签:

【中文标题】无法定义以 keycloak 开头的属性【英文标题】:Unable to define properties which start with keycloak 【发布时间】:2021-08-10 19:22:54 【问题描述】:

。如果 keycloak-spring-boot-starter starter jar 观察到 jar 不知道的 keycloak 属性,则无法加载属性。如果我们为属性添加前缀“sso”,问题就会得到解决,即使保留 keycloak 前缀,是否有办法避免此错误。

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

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

这是Spring Boot 2.5.0 and 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)

【问题讨论】:

【参考方案1】:

此错误是在 Spring Boot 2.5.0 附带的版本 5.5.0 of Spring Security 中引入的。 发生这种情况是因为 KeyCloak 一个接一个地添加了两个过滤器,如下所示:

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

现在存在一个错误,即自定义过滤器顺序没有被保留,因此在尝试添加与最近添加的另一个自定义过滤器相关的过滤器时会导致 NullPointerException

我建议您现在做的是使用较低版本的 Spring Boot,例如 2.4.x,直到 issue in GitHub 得到解决。

【讨论】:

【参考方案2】:

从 Keycloak 代码看来,他们只将属性硬连线到特定属性。

来自 KeycloakSpringBootProperties

/* 这是一个虚拟属性,以避免重新绑定问题 属性 keycloak.config.resolver 使用 Spring Cloud 时 - 请参阅 KEYCLOAK-2977 */

从他们的代码看来,我们可以利用他们必须包含其他属性的解决方法。 但要做到这一点,我们必须在其中添加“配置”。

keycloak.config.admin.username=asd
keycloak.config.admin.password=sss

【讨论】:

以上是关于无法定义以 keycloak 开头的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 keycloak 的 ftl 文件中包含 React js 文件?

Keycloak - 无法启动嵌入式服务器:WFLYEMB0022:无法在嵌入式进程上调用“start”:参数“abstractPath”不能为空

如何解决:无法读取节点 js 中未定义的属性“keycloak-token”?

TypeError:无法读取未定义的属性“keycloak-token”

Keycloak - 授权验证失败。原因:无效令牌(错误的 ISS)

使用 Maven Cargo 使用 Keycloak 安装 Wildfly