Keycloak~infinispan中MergedUpdate中lifespanMs和maxIdleTimeMs
<p>在 Keycloak 中,<code>MergedUpdate</code> 类里的 <code>lifespanMs</code> 和 <code>maxIdleTimeMs</code> 是与 Infinispan 分布式缓存会话管理密切相关的两个核心参数。它们共同决定了用户会话在缓存中的存活时间。</p><p>下面的表格能帮你快速把握它们的核心区别:</p>
<table>
<thead>
<tr>
<th style="text-align: left">参数</th>
<th style="text-align: left">含义</th>
<th style="text-align: left">对应 Keycloak 配置举例</th>
<th style="text-align: left">过期触发条件</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"><strong><code>lifespanMs</code></strong></td>
<td style="text-align: left">会话的<strong>绝对最大存活时间</strong></td>
<td style="text-align: left"><code>SSO Session Max</code></td>
<td style="text-align: left">从会话创建开始计时,无论是否活跃,到期即过期。</td>
</tr>
<tr>
<td style="text-align: left"><strong><code>maxIdleTimeMs</code></strong></td>
<td style="text-align: left">会话的<strong>最大空闲时间</strong></td>
<td style="text-align: left"><code>SSO Session Idle</code></td>
<td style="text-align: left">从最后一次访问会话开始计时,如果持续空闲超过设定时间则过期。</td>
</tr>
</tbody>
</table>
<h3 id="-参数详解与应用">💡 参数详解与应用</h3>
<ul>
<li>
<p><strong><code>lifespanMs</code>(生存时间)</strong>:这个参数为会话设置了一个“最终期限”。例如,如果 <code>SSO Session Max</code> 设置为 8 小时,那么即使用户一直在活动,8小时后该会话也会强制失效,用户需要重新登录。这为会话提供了一个硬性的安全上限。</p>
</li>
<li>
<p><strong><code>maxIdleTimeMs</code>(最大空闲时间)</strong>:这个参数关注的是会话的活跃度。例如,如果 <code>SSO Session Idle</code> 设置为 30 分钟,那么用户如果在 30 分钟内没有任何操作(如访问受保护的页面),会话就会因空闲而过期。这有助于及时释放不活跃会话占用的资源。</p>
</li>
</ul>
<p><img src="https://images.cnblogs.com/cnblogs_com/lori/2399824/o_260115074857_max_idle.png" alt="" loading="lazy"></p>
<p>Keycloak 在创建或更新一个用户会话对象(如 <code>UserSessionEntity</code>)时,会根据你在 Realm 设置中配置的 <code>SSO Session Max</code> 和 <code>SSO Session Idle</code> 值,计算出对应的 <code>lifespanMs</code> 和 <code>maxIdleTimeMs</code>,并将它们作为元数据设置到 Infinispan 缓存条目中。此后,Infinispan 会负责在后台自动清理过期的会话条目。</p>
<p>下面日志是用户登录后,写入sessions和clientSessions缓存的信息,包含它们的过期时间</p>
<ul>
<li>
<p>sessions</p>
<ul>
<li>Lifespan: max(sso session max & SSO Session Max Remember Me)这3个时间的最大值</li>
<li>MaxIdle: sso session idle (最小时间为300秒,5分钟,所以缓存中最小为5+3=8分钟)</li>
</ul>
</li>
<li>
<p>clientSessions</p>
<ul>
<li>Lifespan: client session max (最小时间为300秒,5分钟,所以缓存中最小为5+3=8分钟)</li>
<li>MaxIdle: client session idle</li>
</ul>
</li>
<li>
<p>当用户会话缓存sessions,它的Lifespan大于客户端clientSessions的Lifespan时,可能出现的情况就是,用户会话列表中显示的<code>客户端</code>为空</p>
</li>
</ul>
<pre><code>15:50:34,725 INFO
(default task-8) Add_if_absent successfully called for entity '8832559e-f1f8-4b22-9878-9dd47a01951c' to
the cache 'sessions' . Lifespan: 600000 ms, MaxIdle: 480000 ms
15:50:34,728 INFO
(default task-8) Add_if_absent successfully called for entity '0c836594-c06d-4968-b5ca-ab6be6e91d4f' to
the cache 'clientSessions' . Lifespan: 1800000 ms, MaxIdle: 780000 ms
</code></pre>
<h3 id="-后台查看与管理">🔍 后台查看与管理</h3>
<p>关于你提到的能否在 Keycloak 管理后台查看具体时间:</p>
<ul>
<li>
<p><strong>查看配置</strong>:你可以在 Keycloak 管理控制台的 Realm 设置中直接找到并修改 <code>SSO Session Max</code> 和 <code>SSO Session Idle</code> 的全局默认值。这些配置值就是 <code>lifespanMs</code> 和 <code>maxIdleTimeMs</code> 的计算依据。</p>
<ul>
<li>路径通常是:<strong>管理控制台</strong> -> 选择你的 <strong>Realm</strong> -> <strong>Realm 设置</strong> -> <strong>令牌</strong> 或 <strong>会话</strong> 标签页。</li>
</ul>
</li>
<li>
<p><strong>查看活跃会话</strong>:Keycloak 管理后台提供了查看当前活跃会话的功能。</p>
<ul>
<li>路径通常是:<strong>管理控制台</strong> -> 选择你的 <strong>Realm</strong> -> <strong>会话</strong> 菜单。<br>
在这里你可以看到当前活跃的用户会话列表。虽然这个界面通常<strong>不会直接显示</strong>每个会话精确到毫秒的剩余 <code>lifespanMs</code> 和 <code>maxIdleTimeMs</code>,但它会展示会话的创建时间或最后活动时间。你可以结合 Realm 的全局会话超时设置,来估算会话的有效期。</li>
</ul>
</li>
<li>
<p><strong>关键限制</strong>:需要明确的是,管理后台<strong>无法直接、实时地显示</strong>每个会话在 Infinispan 缓存条目级别设置的 <code>lifespanMs</code> 和 <code>maxIdleTimeMs</code> 的具体数值。这些是底层缓存的内部元数据,主要用于 Infinispan 自身的过期清理机制,并不在管理界面暴露。</p>
</li>
</ul>
<h3 id="-简单来说">💎 简单来说</h3>
<p><code>lifespanMs</code> 和 <code>maxIdleTimeMs</code> 是 Keycloak 实现会话自动过期的核心机制。它们的值由你在管理界面上设置的 <code>SSO Session Max</code> 和 <code>SSO Session Idle</code> 决定,并最终由 Infinispan 缓存可靠地执行。虽然无法在后台直接看到每个会话的这两个毫秒值,但你可以通过 Realm 设置和会话列表来管理和监控会话的生命周期。</p>
<p>希望这个解释能帮助你更好地理解 Keycloak 的会话过期机制。</p>
</div>
<div id="MySignature" role="contentinfo">
<p></p>
<div class="navgood">
<p>作者:仓储大叔,张占岭,<br>
荣誉:微软MVP<br>QQ:853066980</p>
<p><strong>支付宝扫一扫,为大叔打赏!</strong>
<br><img src="https://images.cnblogs.com/cnblogs_com/lori/237884/o_IMG_7144.JPG"></p>
</div><br><br>
来源:https://www.cnblogs.com/lori/p/19487836
頁:
[1]