如果为用户存储 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的主要内容,如果未能解决你的问题,请参考以下文章
EasyRTC通过Golang缓存库fastcache实现在线用户存储在内存中加快速度