当前位置: 首页 > 知识库问答 >
问题:

Keycloak ClassCastException in isValid() method

柯昱
2023-03-14

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

问题是,在我的凭据InputValidator实现中,该方法

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

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

我期望一个MyCustomUserModel实例,这就是该方法

public UserModel getUserByUsername(String username, RealmModel realm) 

正在回归。因此,我尝试将用户模型转换为MyCustomUserModel,它抛出了以下异常:

未捕获的服务器错误:java.lang.ClassCastException: class org.keycloak.models.cache.infinispan.UserAdapter 无法转换为 class com.package.MyCustomUserModel (org.keycloak.models.cache.infinispan.UserAdapter 位于加载器 'org.keycloak.keycloak.keycloak-model-infinispan@11.0.0' @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的一个实例)。

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

共有1个答案

司徒经纶
2023-03-14

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

ClassCastException不再出现。

我想如果我将来需要缓存,我需要在这方面多做一点努力。

 类似资料:
  • 问题内容: 我有以下代码: 我收到异常java.lang.IllegalArgumentException:参数数量错误。怎么了? 问题答案: 您需要像这样调用方法: (…或在@Jon的答案中使用替代方法。) 当前代码失败的原因与Java中实现可变参数方法的方式有关。本质上是的语法糖。当您调用方法时, 是的语法糖。 在这种情况下,您尝试使用另一个具有相同数组基类型的变量方法来调用变量方法,并且该代

  • 问题内容: 我正在寻找一种从方法中获取Method对象的便捷解决方法。这个想法: 一种明显的方法是将方法的名称用作字符串: 但我想避免这种情况,因为如果我重命名foo(),该代码将停止工作,或者在所有使用该字符串的地方都重命名了该字符串。 用例是我想使用类似于ProperyChangeListeners的东西,但是那些依赖于方法名的字符串。我想(安全地)使用实际方法而不依赖字符串。 我可以使用什么

  • 问题内容: 在用Java编写方法时(例如在论坛,邮件列表,问题跟踪器等),许多人使用’#’符号而不是Java的本机运算符将方法名与类名分开。例如,人们指的是而不是。这种语法从何而来? 问题答案: 这是链接到另一个类的方法时在javadoc注释中使用的表示法。 编辑 收集评论中提供的其他信息: @Hugo指出,表示法又来自HTML锚点 @maksimov指出了调用静态方法的Java语法,这可能会产生

  • 问题内容: 尝试使用PowerMock和Mockito执行单元测试时遇到问题。我需要PowerMockito模拟静态方法。 这些是我正在使用的版本: 当我添加注释@PrepareForTest(Graph.class)时,出现以下错误: 我在PowerMock Google官方页面上读到了这与javassist有关。但是我有点迷茫,我不知道该如何解决。 为了以防万一,我还尝试下载Powermock

  • 问题内容: (这很难搜索,因为结果全都与“方法参考”有关) 我想获取一个Methodlambda表达式的实例,以与基于传统反射的API一起使用。应该包括clousure,因此调用应与调用lambda具有相同的效果。 我已经看过,但是它似乎只与反向转换有关。但是我想该bind方法可能有助于包括clousure? 编辑: 假设我有lambda扩展功能: 我有一个遗留框架(SpEL),其API 这将Me

  • 问题内容: 我正在编写一些可调用的代码,并且执行了数千次。显然,由于反射,这非常慢。 我想看看是否可以在Java 7中使用以提高性能。到目前为止,这里是我所拥有的: 代替,我在做: 但是,这似乎并不比使用反射的Field.set调用更好。我在这里做错什么了吗? 我读到使用可能会更快,但是当我尝试使用它时,得到了。 有谁成功地优化了对Field.set或Field.get的重复调用? 问题答案: 2

  • 问题内容: 我有以下界面: 我想反射性地(在Foo的实现上)调用。 但是,参数在数组中 ,我不知道它的大小。 以下内容不起作用: 那是行不通的,因为它受到编译器作为单个参数的威胁,并且该数组未“扩展”为vararg,而是被(内部)包装为另一个具有单个元素的数组,即 在这种情况下,我该如何调用,以使阵列受到vararg的威胁? 或更笼统的问题:当参数在数组中时,如何调用vararg方法?直到运行时我

  • 问题内容: 我做了很多研究,对我来说一切看起来都不错……但是我无法使它正常工作!有人知道吗? 不管我做什么,相关的映射对任何人都保持公开状态(无论匿名或登录,无论他们扮演什么角色)。 理想情况下,我希望所有请求都公开,但@Secured()注释的请求除外-显然,只有具有特定角色的用户才能访问这些映射。 那可能吗? 仅供参考,我目前构建了一种方法“ hasRole(String role)”,该方法