由于此PR
https://github.com/keycloak/keycloak/commit/056ba75a72b1595ca9fa471f5693201fd5b2c7ae,默认情况下(Keycloak最新版本6.0.1),使用InfinispanChangelogBasedTransaction.java的Infinispan Connection SPI具有非常特殊的CacheDecorator.java用途,将skipCacheStore。这意味着无论您是否配置具有持久性的存储,该存储都将被忽略。
为了实现您想要的内容,除了配置存储之外,还需要自定义
这里的大多数SPI,以确保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();
}
您所看到的 RedisCacheStoreConfigurationBuilder
基本上是原始存储的简化版本,但我不需要Sentinel或Server模式,我只想连接到主机、端口和数据库。
然后,我基本上复制了 org.keycloak.models.sessions.infinispan
,删除了与缓存删除相关的所有内容,并且不使用装饰器使用缓存而是跳过缓存存储。
如果我能提供帮助,请告诉我,我将准备一篇更详细的文章,解释如何执行此操作,还涉及一个包含我所说的代码的存储库。 如果有人仍在尝试,请告诉我更多信息。