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

使用keycloak UserStorageProvider SPI时出现问题

姬墨竹
2023-03-14

我已经实现了一个自定义的Keycloak UserStorageProvider SPI(以下是官方文档https://www.Keycloak.org/docs/latest/server_development/index.html#_user-storage-spi的第11点),它执行以下操作:

  1. 根据外部身份验证服务对用户(以前不存在于本地存储中)进行身份验证。
  2. 将(针对自定义服务成功进行身份验证的)用户保存到Keycloak本地存储中。
  3. 在KeyCloak的本地存储中导入用户后(用户成功登录后),管理员就可以从KeyCloak的管理控制台将角色映射到这些用户以获得资源授权。

我遇到的问题是:第1步和第2步工作得很好。关于第3步,我可以用保存在keycloak本地存储中的用户成功地登录自己(在外部UserProvider上找到它之后),但是(这里是问题的症结所在);一旦我向导入用户添加任何角色,我就不能再将自己登录到该帐户中,并且日志显示,从该用户登录时起,我的自定义UserStorageProvider不再被使用。通过某种方式将角色附加到该用户会使我的自定义UserStorageProvider看不到该用户(即使我再次删除了该角色)。

在我试图实现的最佳情况下,我可以与用户“登录”(通过外部SPI的身份验证后保存在本地),甚至在为他分配角色之后。

任何反馈将非常感谢!!

谢谢你的建议。

共有1个答案

王弘和
2023-03-14

如果将来有人遇到这个问题,当您实现一个提供商SPI时,您有两个选项,正如文档中提到的。并将用户导入本地Keycloak存储。如果采用导入/同步策略,则需要将联邦链接设置为提供程序,如下所示:

<UserModel instance>.setFederationLink(<ComponentModel id>);

如果您不这样做,那么Keycloak就不能“记住”那些导入的用户应该由您的提供程序SPI处理,并且通常您不会在自定义提供程序SPI中有预期的行为。

 类似资料:
  • 我有一个数十万对象的列表。当每一个运行时,它都会根据给定的值执行一个可能很长的计算。正因为如此,我希望异步运行每个任务(最好是通过使用某种执行器),并在30秒后检索每次计算的结果,取消那些没有及时完成的结果。(所得值在其他地方使用。) 到目前为止,我就是这样实现它的: ArrayList存储每个要执行的,然后将其发送到ExecutorService以运行所有任务。我遇到的问题是,任务似乎是同步启动

  • 问题内容: 我在应用程序中使用Gson,为此,我使用了一些名称与使用Json相同的类。我的应用程序运行良好,但是在编写proguard时,应用程序崩溃了,我猜有些类正在缩小。我的错误是: java.lang.ClassCastException:com.google.gson.internal.StringMap无法转换为com.sample.package.GsonClass 问题答案: 您需要

  • 我在使用SpecifyKind时遇到问题。我发现,如果我将字符串(“O”)应用于DateTime.Now或new DateTime(),则会使spantime不同。我不知道这是怎么可能的。我尝试将这些日期时间保存为数据库中的Utc,但由于跨度不同,时间将不正确。 我就是这样做的: 现在:2021-12-08 13:40:35现在:2021-12-08T13:40:35.1159209 01:00日

  • 我使用的是NetBeans 8.1,我有一个SpringBoot项目,它具有以下依赖项: 它们都是在依赖项中正确下载的。 该项目有3个java类和一个扩展JpaRepository的接口 在src/main/资源项下- 在html标签上,我有错误:本地名称为“xmlns: th不可序列化为XML 1.0的属性。如果我试图运行该项目并转到http://localhost:8080/页面,我有一个白标

  • 我正在编写一个UDAF,应用于Vector(spark.ml.linalg.Vector)类型的Spark数据帧列。我依赖spark.ml.linalg包,这样我就不必在数据帧和RDD之间来回穿梭。 在UDAF内部,我必须为输入、缓冲和输出模式指定数据类型: VectorUDT是我在spark.mllib.linalg.Vector中使用的:https://github . com/Apache/

  • 请问这是什么原因? 官方文档里的代码复制下来也是错误的