keycloak什么时候删除过期会话?

When does keycloak delete expired sessions?

我注意到通过 SSO session idleSSO session max 的会话不会立即被删除。它们似乎是无效的,因此没有用,但它们并没有立即被删除。我可以在管理控制台的会话选项卡中查看它们。

因为我找不到对此的解释,或者这个机制在内部是如何工作的(没有查看代码),我想知道,是否有人可以详细说明发生了什么?一切正常吗?

Keycloak 严重依赖 Infinispan 进行缓存。许多类型的实体都有直接为其配置的专用缓存,并且不排除会话。

启动 Keycloak 时,您指定配置 file/operation 模式(通过 -c 参数)。例如,当我通过 docker 运行 我的密钥斗篷时,我得到以下命令行:

java -D[Standalone] -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-exports=jdk.unsupported/sun.reflect=ALL-UNNAMED -Dorg.jboss.boot.log.file=/opt/jboss/keycloak/standalone/log/server.log -Dlogging.configuration=file:/opt/jboss/keycloak/standalone/configuration/logging.properties -jar /opt/jboss/keycloak/jboss-modules.jar -mp /opt/jboss/keycloak/modules org.jboss.as.standalone -Djboss.home.dir=/opt/jboss/keycloak -Djboss.server.base.dir=/opt/jboss/keycloak/standalone -Djboss.bind.address=172.19.0.3 -Djboss.bind.address.private=172.19.0.3 -c=standalone-ha.xml -Dkeycloak.profile.feature.token_exchange=enabled -Dkeycloak.profile.feature.admin_fine_grained_authz=enabled

可以看到-D[Standalone](运行模式)和-c=standalone-ha.xml,指向配置XML文件

在其中,您可以看到类似以下内容的部分:

    <subsystem xmlns="urn:jboss:domain:infinispan:11.0">
        <cache-container name="keycloak" module="org.keycloak.keycloak-model-infinispan">
            <local-cache name="realms">
                <heap-memory size="10000"/>
            </local-cache>
            <local-cache name="users">
                <heap-memory size="10000"/>                 
            </local-cache>
            <local-cache name="sessions"/>
            <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">
                <heap-memory size="10000"/>
            </local-cache>
            <local-cache name="keys">
                <heap-memory size="1000"/>
                <expiration max-idle="3600000"/>
            </local-cache>
            <local-cache name="actionTokens">
                <heap-memory size="-1"/>
                <expiration interval="300000" max-idle="-1"/>
            </local-cache>
        </cache-container>
        ...
        ...
        ...
    </subsystem>

您可以尝试调整各种会话缓存 expiration/lifespan 属性。

看看Cache-Configuration section of the manual, and also on the xmlns infinispan-config specification