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

Bev*_*van 5 java keycloak

我创建了一个用户存储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 会抛出异常,如下所示。如果我将缓存策略设置为“默认”,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)
Run Code Online (Sandbox Code Playgroud)

Bev*_*van 3

在您自己的 UserModel 实现中,重写以下方法以在属性不存在时返回空列表。

@Override public List getAttribute(String name) { 最终列表值 = super.getAttribute(name); returnOptional.ofNullable(values).orElse(Collections.emptyList()); }