Как сохранить кэшированные данные Keycloak в постоянное хранилище данных? - PullRequest
0 голосов
/ 25 сентября 2018

Мы запускаем Keycloak (v4.4, автономный режим) внутри 2-х контейнеров Docker.Мы хотим, чтобы эти контейнеры не сохраняли состояние, поэтому мы должны сохранить все кэшированные данные в резервном хранилище (либо в базе данных, либо в другом решении для кэширования, таком как Redis).Мы не можем допустить, чтобы кэшированные данные существовали только в памяти, потому что любой из наших контейнеров может быть уничтожен в любое время.

В идеале мы хотели бы сохранить кэшированные данные в нашем собственном экземпляре Redis.Поскольку Keycloak использует Infinispan, кажется, что это способ настроить Infinispan для использования Redis: http://infinispan.org/docs/cachestores/redis/.

Наивно, я попытался сохранить информацию о сеансе Keycloak в Redis, обновив мой файл standalone-4.4.0.xml, чтобы он выглядел какэто (обратите внимание на элемент redis-store в строке 5):

<subsystem xmlns="urn:jboss:domain:infinispan:6.0">
        <cache-container name="keycloak">
            <local-cache name="sessions">
                <persistence passivation="false">
                    <redis-store xmlns="urn:infinispan:config:store:redis:8.0"
                        topology="server" socket-timeout="10000" connection-timeout="10000">
                        <redis-server host="server1" />
                        <connection-pool min-idle="6" max-idle="10" max-total="20" min-evictable-idle-time="30000" time-between-eviction-runs="30000" />
                    </redis-store>
                </persistence>
            </local-cache>
            <local-cache name="realms">
                <object-memory size="10000"/>
            </local-cache>
            <local-cache name="users">
                <object-memory size="10000"/>
            </local-cache>
            <local-cache name="authenticationSessions"/>
            <local-cache name="offlineSessions"/>
            <local-cache name="clientSessions"/>
            <local-cache name="offlineClientSessions"/>
            <local-cache name="loginFailures"/>
            <local-cache name="work"/>
            <local-cache name="authorization">
                <object-memory size="10000"/>
            </local-cache>
            <local-cache name="keys">
                <object-memory size="1000"/>
                <expiration max-idle="3600000"/>
            </local-cache>
            <local-cache name="actionTokens">
                <object-memory size="-1"/>
                <expiration max-idle="-1" interval="300000"/>
            </local-cache>
        </cache-container>
        <cache-container name="server" default-cache="default" module="org.wildfly.clustering.server">
            <local-cache name="default">
                <transaction mode="BATCH"/>
            </local-cache>
        </cache-container>
        <cache-container name="web" default-cache="passivation" module="org.wildfly.clustering.web.infinispan">
            <local-cache name="passivation">
                    <redis-store xmlns="urn:infinispan:config:store:redis:8.0"
                        topology="server" socket-timeout="10000" connection-timeout="10000">
                    <redis-server host="server1" />
                    <connection-pool min-idle="6" max-idle="10" max-total="20" min-evictable-idle-time="30000" time-between-eviction-runs="30000" />
            </redis-store>
        </persistence>
            </local-cache>
        </cache-container>
        <cache-container name="ejb" aliases="sfsb" default-cache="passivation" module="org.wildfly.clustering.ejb.infinispan">
            <local-cache name="passivation">
                <locking isolation="REPEATABLE_READ"/>
                <transaction mode="BATCH"/>
                <file-store passivation="true" purge="false"/>
            </local-cache>
        </cache-container>
        <cache-container name="hibernate" module="org.infinispan.hibernate-cache">
            <local-cache name="entity">
                <transaction mode="NON_XA"/>
                <object-memory size="10000"/>
                <expiration max-idle="100000"/>
            </local-cache>
            <local-cache name="local-query">
                <object-memory size="10000"/>
                <expiration max-idle="100000"/>
            </local-cache>
            <local-cache name="timestamps"/>
        </cache-container>
    </subsystem>

Но когда я запускаю Keycloak, я получаю эту ошибку:

'persistence' isn't an allowed element here.

Вопрос. Существует ли простой способ настроить Keycloak для сохранения кэшированных данных в Redis или другом постоянном хранилище данных?

1 Ответ

0 голосов
/ 05 августа 2019

Версия подсистемы urn:jboss:domain:infinispan:6.0 не знает об этой схеме вашего xml, поэтому вам придется либо обновить подсистему, либо, если вы используете последний образ Keycloak (6.0.1), возможно, будет проще реализоватьновый InfinispanConnectionProviderFactory, который в основном включает в себя это с Wildfly:

/subsystem=keycloak-server/spi=connectionsInfinispan/:remove()
/subsystem=keycloak-server/spi=connectionsInfinispan/:add(default-provider=custom)
/subsystem=keycloak-server/spi=connectionsInfinispan/provider=custom/:add(properties={},enabled=true)

Для этого вам, конечно, потребуется реализовать расширение и развернуть его.Но на уровне кода вы можете использовать всю мощь последней версии Infinispan.

Я вижу, что вы хотите использовать Redis, это еще одна большая проблема, пожалуйста, прочитайте этот ответ https://stackoverflow.com/a/57362238/571689 где я расскажу вам о следующих проблемах, с которыми вы столкнетесь.

...