isValid() 方法中的 Keycloak ClassCastException

Keycloak ClassCastException in isValid() method

我是 运行 Docker 容器中的 Keycloak 服务器。然后我编写了一个自定义用户存储提供程序来检查身份验证。

问题是在我的 CredentialInputValidator 实现中,方法

public boolean isValid(RealmModel realmModel, UserModel userModel, CredentialInput credentialInput)

以 org.keycloak.models.cache.infinispan.UserAdapter 的实例作为第二个参数 (userModel) 调用。

我希望有一个 MyCustomUserModel 实例,这就是方法

public UserModel getUserByUsername(String username, RealmModel realm) 

回来了。所以我尝试将 userModel 转换为 MyCustomUserModel 并抛出以下异常:

Uncaught server error: java.lang.ClassCastException: class org.keycloak.models.cache.infinispan.UserAdapter cannot be cast to class com.package.MyCustomUserModel (org.keycloak.models.cache.infinispan.UserAdapter is in unnamed module of loader 'org.keycloak.keycloak-model-infinispan@11.0.0' @35823d20; com.package.MyCustomUserModel is in unnamed module of loader 'deployment.keycloak_custom_ext_ear-0.0.1-SNAPSHOT.ear.keycloak_custom_ext-0.0.1-SNAPSHOT.jar' @139eb90f)

事实上,使用我在其他测试中使用的其他 Keycloak 服务器,完全相同的用户存储提供程序正在按预期工作(MyCustomUserModel 的一个实例)。

也许我在配置 Keycloak 服务器时失败了,但我不知道可能涉及什么选项。知道问题出在哪里吗?

问题出在缓存策略中。在 Keycloak 的管理应用程序中,在用户联合部分下,编辑我的用户存储提供程序并选择 NO_CACHE 作为缓存策略。

ClassCastException 不再出现。

我想如果我将来需要缓存,我将需要为此付出更多努力。