如果为用户存储 SPI 选择“NO_CACHE”缓存策略,KeyCloak 7.0.0 会抛出 NullPointerException

Posted

技术标签:

【中文标题】如果为用户存储 SPI 选择“NO_CACHE”缓存策略,KeyCloak 7.0.0 会抛出 NullPointerException【英文标题】:KeyCloak 7.0.0 throws NullPointerException if select "NO_CACHE" cache policy for User Storage SPI 【发布时间】:2020-01-11 16:00:00 【问题描述】:

我创建了一个用户存储SPI,用于对外部数据库中的用户进行身份验证,我可以在KeyCloak的“用户”页面中列出所有用户,用户可以从keycloak登录页面http://127.0.0.1:8080/auth/realms/dev/account/登录。但是如果我想从http://127.0.0.1:8080/auth/realms/dev/protocol/openid-connect/token 获取访问令牌,KeyCloak 会抛出如下异常。如果我将缓存策略设置为“DEFAULT”,则 KeyCloak 运行良好。

09:18:04,972 ERROR [org.keycloak.services.error.KeycloakErrorHandler] (default task-3) Uncaught server error: java.lang.NullPointerException
        at org.keycloak.models.utils.KeycloakModelUtils.resolveAttribute(KeycloakModelUtils.java:415)
        at org.keycloak.protocol.oidc.mappers.UserAttributeMapper.setClaim(UserAttributeMapper.java:101)
        at org.keycloak.protocol.oidc.mappers.AbstractOIDCProtocolMapper.setClaim(AbstractOIDCProtocolMapper.java:119)
        at org.keycloak.protocol.oidc.mappers.AbstractOIDCProtocolMapper.transformAccessToken(AbstractOIDCProtocolMapper.java:81)
        at org.keycloak.protocol.oidc.TokenManager.transformAccessToken(TokenManager.java:553)
        at org.keycloak.protocol.oidc.TokenManager.createClientAccessToken(TokenManager.java:411)
        at org.keycloak.protocol.oidc.TokenManager$AccessTokenResponseBuilder.generateAccessToken(TokenManager.java:712)
        at org.keycloak.protocol.oidc.endpoints.TokenEndpoint.resourceOwnerPasswordCredentialsGrant(TokenEndpoint.java:609)
        at org.keycloak.protocol.oidc.endpoints.TokenEndpoint.processGrantRequest(TokenEndpoint.java:190)

【问题讨论】:

【参考方案1】:

在您自己的 UserModel 实现中,如果该属性不存在,请覆盖以下方法以返回一个空列表。

@覆盖 公共列表getAttribute(字符串名称) 最终列表值 = super.getAttribute(name); 返回 Optional.ofNullable(values).orElse(Collections.emptyList());

【讨论】:

【参考方案2】:

我通过让我的 UserModel 扩展 AbstractUserAdapter 来解决同样的问题,这样常见(对我来说是不必要的)方法以标准/非失败方式运行。

【讨论】:

以上是关于如果为用户存储 SPI 选择“NO_CACHE”缓存策略,KeyCloak 7.0.0 会抛出 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak 用户存储 SPI 实现

SylixOS NUC970平台SPI总线数据传输

spi-mem: 为SPI存储器生态系统带来一些一致性

EasyRTC通过Golang缓存库fastcache实现在线用户存储在内存中加快速度

Everspin MRAM串行SPI MR25H256ACDF

如何使用Arduino ESP32将数据存储到MicroSD(软SPI和硬SPI)