集成 CAS 单点登录的项目中,实现多点登出效果(在 A 网站点退出后,共享同一个 CAS TGT 票据的 B 网站也被退出)比较简单,集成官方解决方案的配置(在 web.xml 中配置casSingleSignOutFilter)即可。
但是官方解决方案只是对标准的 http session进行处理。
如果项目中使用了 Shiro Session 进行管理的话,官方解决方案无法实现多点登出效果。
因此需要自行实现收到 CAS 服务器发过来的 logout 请求时,自行处理销毁 Shiro Session 的逻辑。
Github 上有这个实现的代码。
https://github.com/howiefh/framework
集成办法:
1 将 io.github.howiefh.cas.session下面的 3 个类加入到工程中。
CasLogoutFilter.java
HashMapBackedSessionMappingStorage.java
SingleSignOutHandler.java
1
2
3
2 shiro–cas的配置文件中,加入 CasLogoutFilter 的配置。
<bean id="casLogoutFilter" class="io.github.howiefh.cas.session.CasLogoutFilter">
<property name="sessionManager" ref="sessionManager"/>
</bean>
1
2
3
/casFailure.jsp = anon
/cas = casLogout,cas
/logout = logout
/** = casLogout,user
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
这个方法的解决思路是:
1 首先记录 CAS Token, 在登录后 CAS Server 回调时进行。将 Token 和 Shiro session id 绑定起来(用 HashMap)。
2 然后收到 CAS Server 发过来的登出 post 请求时,根据 token 取得 Shiro session id,将session id 做一个清理标记。
这时候不能直接进行登出处理,因为拥有 logout 方法的 Shiro Subject 对象是和线程绑定的,所以这里不能获取到正确的 Subject 对象。
3 用户再次使用网站时,这时候检查用户的 Shiro session id 是不是已被标记为清理。
如果已被标记,此时掉用 Subject 对象的 logout 方法,进行登出处理。
供参考。
作者:zhmz1326
来源:CSDN
原文:https://blog.csdn.net/zhmz1326/article/details/52287649
版权声明:本文为博主原创文章,转载请附上博文链接!