CAS 4.1.3 SLO实现异常:退出Client1后Client2/3仍登录
看起来你的CAS单点登出流程已经触发了CAS服务器向client2、client3发送logout请求,但客户端没正确处理——从日志里的307 Temporary Redirect就能看出问题所在。咱们一步步排查和解决:
1. 检查SingleSignOutFilter的映射配置(最可能的原因)
你只贴了filter和listener的定义,但filter的映射规则才是关键!如果没正确配置,logout请求根本到不了SingleSignOutFilter。
必须添加正确的filter-mapping,并且放在所有CAS相关Filter的最前面:
<filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> <!-- 必须包含所有dispatcher类型,确保logout请求能被捕获 --> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping>
要保证这个mapping在CAS Authentication Filter、CAS Validation Filter的mapping之前,否则logout请求会被其他过滤器拦截或重定向。
2. CAS服务器端的Service配置遗漏
CAS服务器需要知道每个客户端的登出回调地址,才能正确发送logout请求。你需要在CAS的service registry里为每个客户端(client1、client2、client3)添加logoutUrl配置:
比如client2的service配置(以JSON格式为例):
{ "@class": "org.jasig.cas.services.RegexRegisteredService", "serviceId": "^https://localhost:8443/client2/.*$", "name": "Client2", "id": 2, "logoutUrl": "https://localhost:8443/client2/logout/cas" }
这里的logoutUrl要指向客户端能被SingleSignOutFilter处理的路径(一般就是客户端的根路径或者专门的登出路径,只要filter能覆盖到就行)。
3. 处理307重定向问题
从日志看,CAS服务器向/client2发送POST请求后收到了307响应,说明这个路径被客户端的其他规则(比如登录拦截器、路由配置)重定向了,导致logout请求没被SingleSignOutFilter处理。
- 检查客户端的
/client2路径是否允许POST请求访问,不会被强制重定向到登录页; - 如果客户端有登录拦截过滤器,要排除logout请求的路径(比如上面配置的
/logout/cas),让它能被SingleSignOutFilter正常处理。
4. 验证客户端Session映射是否正常
SingleSignOutFilter会把CAS的SessionIndex和客户端本地的HttpSession做关联,登出时通过这个关联找到对应的session销毁。你可以在客户端添加日志,验证这个关联是否正确生成:
- 登录客户端后,查看SingleSignOutFilter的日志,确认
SessionIndex和本地session ID的映射已存储; - 检查
SingleSignOutHttpSessionListener是否正常监听session销毁事件,确保session能被正确清理。
5. 额外配置检查
- 确保客户端的
CAS Validation Filter配置了useSession="true",这样客户端会用本地session存储用户信息,方便登出时销毁; - 检查CAS客户端的版本兼容性,3.4.1版本的SingleSignOutFilter是否需要额外的初始化参数(比如
serverName,不过你已经配置了casServerUrlPrefix,一般没问题)。
按照上面的步骤排查,应该就能解决client2、client3无法同步登出的问题了。
内容的提问来源于stack exchange,提问作者sathish salvador

