Keycloak - Infinispan Redis 缓存存储

2024-01-15

目前正在以standalone-ha模式设置keycloak集群,以便能够在docker swarm上运行。在 keycloak 中,用户会话缓存在嵌入式 infinispan 存储中,并且 infinispan 可以配置为跨集群的分布式缓存。

我也将所有者设置为2,但问题是..在缩小规模期间,如果包含缓存的两个所有者在缩小期间都被杀死,则用户会话可能会丢失。

我还阅读了有关 Infinispan Redis 缓存存储的信息,但我不确定如何配置它。

问题一: 是否可以配置 Keycloak Infinispan 以使用 Redis 存储?

问题2: 如果这是不可能的,有没有一种方法可以克服这个问题?

任何的意见都将会有帮助。


由于这个公关https://github.com/keycloak/keycloak/commit/056ba75a72b1595ca9fa471f5693201fd5b2c7ae https://github.com/keycloak/keycloak/commit/056ba75a72b1595ca9fa471f5693201fd5b2c7ae默认情况下(Keycloak最新版本6.0.1)Infinispan Connection SPI它使用InfinispanChangelogBasedTransaction.java有一个非常特殊的用途CacheDecorator.java这将skipCacheStore。这意味着无论您是否配置具有持久性的存储,该存储都将被忽略。

为了实现你想要的,除了配置商店之外,你还必须在这里自定义大部分 SPIhttps://github.com/keycloak/keycloak/tree/master/model/infinispan/src/main/resources/META-INF/services https://github.com/keycloak/keycloak/tree/master/model/infinispan/src/main/resources/META-INF/services以确保 Keycloak 将使用缓存存储。

这也不是一件容易的事,因为这个过程涉及到很多额外的好处,例如,由于 Keycloak 使用的是 Jboss 的 Marshaller,如果你自定义这个 SPI,你将不得不带上大部分org.keycloak.models.sessions.infinispan打包并注册您的模块,以确保 Wildfly 能够看到要编组的实体。

另一件事是,使用 Redis,您应该配置指向一个公共数据库的大部分缓存,除了authenticationSessions不能与以下内容位于同一个数据库中sessions,否则会出现类似的冲突RootAuthenticationSesssionEntity被发现但预计会出现SessionEntityWrapper.

要恢复,这个过程会很痛苦,但如果你想敢于去做,我就是这样做的:

  • 引入了自定义 InfinispanConnectionProviderFactory 以便能够完全使用 infinispan 配置,然后配置我的容器,例如:
private Configuration getRedisConfiguration(int database) {
    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.persistence()
      .passivation(false)
      .addStore(RedisCacheStoreConfigurationBuilder.class)
      .ignoreModifications(false)
      .fetchPersistentState(false)
      .purgeOnStartup(false)
      .preload(false)
      .shared(true)
      .addProperty("host", System.getenv("REDIS_HOST"))
      .addProperty("port", System.getenv("REDIS_PORT"))
      .addProperty("database", String.valueOf(database));

    return cb.build();
  }

The RedisCacheStoreConfigurationBuilder您会看到,基本上是原始商店的精简版本,但我不需要哨兵或服务器模式,我只想连接到主机、端口和数据库。

然后我基本上复制了org.keycloak.models.sessions.infinispan删除与删除缓存相关的所有内容,而不是正常使用没有装饰器的缓存来跳过CacheStore。

如果我可以提供帮助,请告诉我,我最会准备一篇文章,指导更详细的操作方法,还涉及一个包含我正在讨论的代码的存储库。如果有人仍在尝试此操作,请告诉我更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Keycloak - Infinispan Redis 缓存存储 的相关文章

随机推荐

  • 无法使用新的 Windows 终端在 WSL2 中启动 Docker

    我最近安装了 WSL2 并从 Microsoft Store 安装了 Ubuntu 当我使用以下命令运行 docker 时 sudo service docker start 我收到以下消息 Cannot connect to the Do
  • Rails 中脚手架和模型的区别

    在 Rails 中生成脚手架和生成模型有什么区别 这样做的优点 缺点是什么 当您生成模型时 您会获得一个模型以及一些相关组件 我最喜欢的解释此类主题的方法之一是实际尝试或鼓励其他人尝试 所以如果我输入命令rails generate mod
  • 如何使用 RSpec 测试实例变量在控制器中实例化

    我正在尝试检查 RESTful 控制器中的新操作是否设置了所需对象类型的实例变量 看起来很典型 但执行起来遇到困难 客户端控制器 def new client Client new end Test describe GET new do
  • MongoDB 中的两阶段提交

    仔细阅读后在线文档 http docs mongodb org manual tutorial perform two phase commits 我对MongoDB中的两阶段提交还有很多疑问 在本节中从故障场景中恢复 为什么只有两类失败
  • 反映.net中的常量属性/字段[重复]

    这个问题在这里已经有答案了 我有一个类 如下所示 public class MyConstants public const int ONE 1 public const int TWO 2 Type thisObject public M
  • 镜像(翻转)视图/进度条

    我有一个定制的圆形进度条 用于时钟上的秒计数器 我想翻转它 以便时钟逆时针计数 在这里搜索解决方案 我发现了这个 从右到左进度条 https stackoverflow com questions 3877823 right to left
  • 如何验证 PAC(代理自动配置)文件内的 Socks 5 代理

    如何设置 PAC 文件以使用带有身份验证的 SOCKS 代理 使用这个简单的 PAC 文件作为示例 function FindProxyForURL url host return SOCKS 69 123 133 75 7257 您将如何
  • 尝试向按钮添加触发器以更改按钮的 Content 属性

    我有一个用户控件 上面有一个按钮 UserControl 有一个名为 IsNew 的 DependencyProperty 这是一个布尔值 如果在控件中编辑的对象是新创建的并且尚未写入数据库 则该值设置为 true 否则就是假的 我有一个按
  • 如何使用python识别中文或英文名字[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定一堆名字 我们如何找出哪些是中文名 哪些是英文名 对于中文名字 我建立了一个中文姓氏列表来找出中文名字 比如李小龙 李是中国姓氏
  • Chrome 扩展程序安装

    我有 chrome 扩展 它是使用安装程序安装的 该安装程序安装一些进程和浏览器扩展 根据 chrome 安全性更改 独立安装将被阻止 谷歌将阻止本地 Chrome 扩展程序 http thenextweb com google 2013
  • Webkit 浏览器根据 colspan 渲染表格

    请告知我是否出现幻觉 我希望如此 因为我无法根据浏览器正确渲染表格 我希望有人能为我提供解决方案 我的问题是 某些表格在使用 webkit 的浏览器 即 Safari 和 Chrome 中不显示右侧边框 根据帮助下的关于菜单项 我使用的 S
  • VBA 使用 OFT 模板从 Excel 发送电子邮件 - 禁止自动签名

    我创建了一个宏 用于打开 Outlook 电子邮件模板以供用户发送 以及从电子表格中提取的一些附加信息 一切都很顺利 只是 Outlook 会根据用户设置自动附加签名 虽然我可以很容易地关闭自己的签名 但我并不是唯一可能运行此宏的人 电子邮
  • “docker ps -a”是什么意思?

    经常使用 Docker 的任何人都熟悉常用命令docker ps and docker ps a 我知道docker ps列出了 Docker 引擎中所有正在运行的容器 但是 ps 实际上意味着什么 我也知道docker ps a具有还列出
  • 使用 FOP 中的 OutputStream 渲染图像

    我想在 PDF 上渲染图像 该图像将由 FOP 生成 为了渲染图像 我使用标签
  • 手动将搭配添加到 gensim 短语器

    我正在对语言学论文进行主题建模 并使用 Gensim 短语来识别频繁的搭配 我希望能够将术语 do support 和 it clefts 标记为一个单词 因为它们是特定的语言术语 但是 如果我在取出停用词后制作 Gensim 模型 则不会
  • MSHTML:CreateDocumentFromString 而不是 CreateDocumentFromUrl

    我想使用 MSHTML 库来解析字符串变量中的一些 HTML 但是 我不知道该怎么做 我可以轻松解析给定已知 URL 的网页内容 但不能直接解析源 HTML 这可能吗 如果是这样 怎么办 Public Sub ParseHTML sHTML
  • 身份验证和资源服务器之间的 OAuth v2 通信

    我在理解 OAUTH v2 的工作原理时遇到一些困难 The OAuth 版本 2 规范 https datatracker ietf org doc html draft ietf oauth v2 16 section 7 reads
  • 反射式获取项目中的所有包?

    如何反思性地获取项目中的所有包 我从 Package getPackages 开始 但这只获取了与当前包关联的所有包 有没有办法做到这一点 PhilippWendler 的评论让我找到了一种完成我需要的方法 我稍微调整了该方法以使其递归 R
  • 错误 4:从“错误”中选择“消息”,其中“错误”= 1707(也是 1709)

    我使用 WiX 3 8 创建了一个 MSI 安装程序 安装时在 MSI 日志的最后出现此错误 Property C WIXUI INSTALLDIR VALID 1 Logging stopped 8 20 2014 19 15 03 No
  • Keycloak - Infinispan Redis 缓存存储

    目前正在以standalone ha模式设置keycloak集群 以便能够在docker swarm上运行 在 keycloak 中 用户会话缓存在嵌入式 infinispan 存储中 并且 infinispan 可以配置为跨集群的分布式缓