问题描述
我正在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,并引发以下异常:
未捕获的服务器错误:java.lang.classCastException:类 org.keycloak.models.cache.infinispan.UserAdapter无法强制转换为 com.package.MyCustomusermodel类 (org.keycloak.models.cache.infinispan.UserAdapter在未命名的模块中 加载程序'[email protected]'@ 35823d20; com.package.MyCustomusermodel在加载程序的未命名模块中 '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不再出现。
如果将来我需要缓存,我想我需要为此付出更多努力。