Liberty 18.0.0.1集体环境中自定义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

