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