You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liberty 18.0.0.1集体环境中自定义TAI跨服务器认证缓存失效问题

Liberty集体环境中自定义TAI缓存键跨服务器未命中的解决方案

你遇到的这个问题本质是Liberty集体环境(collective)的认证缓存同步机制和WAS Classic Cell的实现差异——Classic会自动同步自定义的Subject缓存键,但Liberty默认不会处理这类自定义键的跨节点同步,导致用户跨服务器访问时找不到对应的缓存条目,触发重新认证。

下面是具体的解决步骤:

  • 第一步:启用自定义缓存键的分布式同步
    在所有集体成员服务器的server.xml中,配置认证缓存同步时开启自定义键的同步支持。需要添加或调整以下配置:

    <featureManager>
        <feature>collectiveMember-1.0</feature>
        <feature>appSecurity-2.0</feature>
        <feature>distributedCache-1.0</feature> <!-- 分布式缓存特性必须启用 -->
    </featureManager>
    
    <authCache id="authCache" cacheSize="10000" timeout="300">
        <distributedCacheRef ref="defaultDistributedCache"/>
        <!-- 关键属性:开启自定义缓存键的跨节点同步 -->
        <property name="com.ibm.ws.security.auth.cache.distributed.includeCustomKeys" value="true"/>
    </authCache>
    
    <distributedCache id="defaultDistributedCache" libraryRef="ehcacheLib"/>
    

    这里的com.ibm.ws.security.auth.cache.distributed.includeCustomKeys默认是false,设置为true后,Liberty会把自定义TAI生成的缓存键同步到集体的分布式缓存池里。

  • 第二步:确保自定义TAI的缓存键生成逻辑跨节点一致
    检查你的TAI代码,确保生成缓存键的逻辑不会依赖节点本地的唯一标识(比如服务器名称、本地IP地址)——这些值在不同节点上不一样,会导致同一个用户在不同节点生成的缓存键不匹配。
    举个反例(要避免的写法):

    // 错误:依赖本地服务器名,跨节点键不一致
    String cacheKey = "tai_" + userId + "_" + System.getProperty("wlp.server.name");
    

    正确的写法应该是用全局一致的标识生成键:

    // 正确:仅使用用户全局唯一ID生成键
    String cacheKey = "custom_tai_auth_" + userId;
    
  • 第三步:重启节点并验证效果
    修改完配置和代码后,重启集体中的所有成员服务器,确保配置完全生效。然后进行跨节点访问测试:用户在A服务器完成认证后,直接访问B服务器的资源,此时应该不会触发重新认证,同时查看日志,确认没有再出现AuthenticationException的缓存未命中报错。

如果问题仍然存在,可以开启调试日志来排查细节:
在server.xml中添加日志追踪配置,查看缓存同步的具体过程:

<logging traceSpecification="com.ibm.ws.security.auth.cache.*=all:com.ibm.ws.collective.cache.*=all"/>

通过日志可以确认自定义缓存键是否被正确同步到分布式缓存,以及跨节点访问时是否成功读取到缓存条目。

内容的提问来源于stack exchange,提问作者bwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:41:29