Keycloak - Infinispan Redis缓存商店

时间:2017-08-25 12:54:27

标签: jboss wildfly infinispan keycloak

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

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

我还读过有关Infinispan Redis缓存存储的信息,但我不知道如何配置它。

问题1: 是否可以将Keycloak Infinispan配置为用户Redis商店?

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

任何建议都会有所帮助。

3 个答案:

答案 0 :(得分:2)

由于默认情况下此PR https://github.com/keycloak/keycloak/commit/056ba75a72b1595ca9fa471f5693201fd5b2c7ae(Keycloak最新版本6.0.1),使用Infinispan Connection SPI的{​​{1}}对InfinispanChangelogBasedTransaction.java的使用非常特殊,它将{ {1}}。这意味着无论您是否为存储配置持久性存储,该存储都将被忽略。

为了实现所需的功能,除了配置存储外,还必须在https://github.com/keycloak/keycloak/tree/master/model/infinispan/src/main/resources/META-INF/services处自定义大多数SPI,以确保Keycloak将使用缓存存储。

这也不容易,因为该过程涉及很多特权,例如,由于Keycloak使用的是Jboss的Marshaller,因此,如果您自定义此SPI,则必须带上大部分{{1} }打包并注册您的模块,以确保Wildfly能够看到要编组的实体。

另一件事是,您应该使用Redis配置指向一个公共数据库的大多数缓存,除了CacheDecorator.java不能与skipCacheStore处于同一数据库之外,否则,将会存在发生冲突,例如发现org.keycloak.models.sessions.infinispan但预期会是authenticationSessions

要继续,整个过程将很痛苦,但是如果您想敢做,那就是我实现的目标:

  • 引入了自定义的InfinispanConnectionProviderFactory,以便具有使用infinispan配置并随后像以下配置我的容器的全部功能:
sessions

您看到的RootAuthenticationSesssionEntity基本上是原始存储的简化版本,但是我不需要Sentinel或Server模式,我只想连接到主机,端口和数据库。

然后,我基本上复制了SessionEntityWrapper,删除了与删除缓存有关的所有内容,而不是通常不使用带有装饰器的缓存来跳过CacheStore。

让我知道我是否可以提供帮助,我将最准备一个帖子,指示如何执行此操作,其中还包含一个包含我所讨论的代码的存储库。如果有人仍在尝试此操作,请告诉我更多信息。

答案 1 :(得分:1)

在Infinispan背后使用Redis商店的任何特殊原因?

更简单的解决方案可能是为文件或共享数据库配置持久性。对于像这样的缓存用例,基于文件的持久性可能就足够了。有关使用基于文件的持久性配置Infinispan的示例,请参阅here。或者,您可以存储到共享数据库,例如Postgresql,但需要更多设置(例如,请参阅ref card)。

答案 2 :(得分:1)

当期望动态扩展大型系统时,可以避免在配置中注册可用节点列表的这种限制。因此,在这里发现Redis节点是有好处的。

Infinispan本身支持Redis Store作为实现SPI和添加XML实体以简化配置的扩展:

但是WildFly infinispan子系统中尚不支持此扩展-因为Keycloak依赖WildFly。

因此,我希望通过以下任务来为WildFly和Keycloak提供Infinispan Redis Store:

工作正在进行中,可能会发布代码和配置。