Spring(Wicket)应用使用KeycloakOIDCFilter时跨应用登出无法即时失效会话的问题排查与解决
跨应用登出时Spring(Wicket)应用未即时失效的解决方案
我前段时间碰到过和你完全一致的问题!一开始也以为是自己的Spring(Wicket)应用(对应你的ApplicationA)配置有问题,折腾了好久代码和Keycloak过滤器设置,结果最后发现问题根源在Keycloak认证服务端(你的AuthenticationApplication)那边。
问题回顾
你这边的场景是:
- ApplicationA基于Spring+Wicket,用
keycloak-servlet-filter-adapter和keycloak-authz-client对接Keycloak认证 - ApplicationB/C用React Keycloak组件,从ApplicationA登出时B/C能同步登出,但反过来从B/C登出后,ApplicationA的会话不会立即失效,要等超时才会跳转到登录页
- 需求是:从其他应用登出后,访问/刷新ApplicationA的任意页面时,会话立即失效并跳转到AuthenticationApplication的登录页
排查结论与解决方法
根本问题是AuthenticationApplication无法定位到ApplicationA,导致Keycloak没法主动给ApplicationA发送登出通知请求(也就是/k_logout接口调用)。
解决步骤超级简单,不需要修改ApplicationA的任何代码或配置:
- 找到AuthenticationApplication所在服务器的
/etc/hosts文件 - 添加ApplicationA的域名与IP地址的映射,比如:
192.168.1.100 applicationa.yourdomain.com - 保存文件后,重启AuthenticationApplication(或者等待DNS缓存生效)
做完这一步后,你再从ApplicationB/C登出账号,然后刷新ApplicationA的页面,就会立即跳转到AuthenticationApplication的登录页,会话即时失效——完全符合你的需求!
确认原配置有效性
你之前的配置其实完全没问题,这里再帮你确认下:
- pom.xml依赖:
keycloak-servlet-filter-adapter和keycloak-authz-client的版本(10.0.2)适配你的场景 - web.xml过滤器配置:
KeycloakOIDCFilter拦截所有请求的设置是正确的 - 获取Token的代码:通过
RefreshableKeycloakSecurityContext获取Token的逻辑也没问题,之前之所以在其他应用登出后还能拿到Token,就是因为Keycloak没通知ApplicationA失效会话
内容的提问来源于stack exchange,提问作者Borgy Manotoy
相关产品推荐
相关产品推荐

