sprimgmvc+shiro+cas单点登录

一、单点退出实现原理分析:

项目背景:
项目实现技术包括springmvc+shiro(会话管理、权限控制)+cas(单点登录、单点登出),现有两个系统分别为A和B,两个系统的会话session不共享,即两个系统分别有自己的session。cas的单点登录包括两种情况,1)用户主动点击系统的退出按钮,两个系统同时退出系统,2)某个系统的session时间到期,当一个系统退出的同时,要求另一个系统也同时退出。
1、用户主动点击系统的退出按钮:
两个系统分别为A和B,项目使用shiro管理session会话,A和B分别独立使用自己的session会话。在实现单点退出时,如果A系统点击的“退出”按钮,则B系统也会跟着同时退出,原理分析:issueRedirect
例如业务系统A的地址为:http://localhost:8080/A,业务系统B的地址为:http:localhost:8080/B,单点登录服务端地址为:http://localhost:8080/cas,此时当业务系统A点击退出时,首先会进入到shiro的过滤器filter中,执行shiro的退出动作,即执行subject.logout,如果执行成功,没有出现异常,则会继续调用issueRedirect方法,执行cas服务端的退出动作,即跳转链接地址到:http://localhost:8080/cas/logout方法,当cas服务端接收到这个请求时,会先进行tgt的销毁动作,之后查询之前登录的子应用链接,分别给各个子应用发送退出的请求,地址为:http://localhost/A/logoutRequest,这时会触发子应用的cas-client的过滤器,如下:
在这里插入图片描述
执行该方法时会在session中设置一个登出的标识,如下:
在这里插入图片描述
设置该标识后,如果子应用B在访问系统的功能时,请求会被过滤器拦截,此时会校验session的这个参数是否为true,如果是,则说明其他的应用系统执行了退出的动作,那么当前应用系统也会执行subject.logout的shiro退出动作,同时销毁当前应用的session,之后跳转到登录页面。
2、cas的tgt到期执行退出:
两个子应用在生产上分别设置了session的有效时间,都是30分钟,cas-server的tgt时间刚开始是默认的时间,使用了一段时间后发现,当子应用的session时间到了之后,并没有退出系统,在本地进行测试,发现确实没有退出,继续跟进代码,当子应用的session时间到期,确实销毁了session,但是当前系统还拥有cas的登录标识,即ticket,从而触发了子应用登录的流程,子应用带着ticket去cas-server端进行校验,因为此时tgt还没过期,所以校验通过了,这时会返回校验成功的标识,子应用会重新创建session,并不会执行退出的动作。
通过对代码流程的研究发现,使用的cas-server后,shiro的session失效时间并没什么作用,只有控制住cas-server的tgt时间才能控制系统退出时间,在继续研究cas的tgt过期时间策略。
cas-server端的tgt过期策略为,当设置了tgt的过期时间后,cas-server在启动后,会定时(1分钟或者2分钟)扫一次tgt的时间是否过期,当发现tgt时间到,会将cas-server端的tgt删除,并执行单点退出的流程,即获取子应用的地址,发送带有logoutReequest参数的请求到各个子应用系统。子应用系统的过滤器会触发到这个请求,从而执行跟单点退出相同的流程。
注:想看cas-server端的代码执行流程,可以将cas-server端的日志级别调到最低,这样从日志中可以看到cas-server退出大体的执行过程。
存在的问题:如果子应用的session不起作用,从而使用cas-server的tgt过期时间,那么系统将不在有session活跃的功能。正常情况下应该是根据不活跃的session时间来控制系统的退出,但是cas-server的tgt时间是固定的,没办法实现动态修改,所以只能让系统在使用了一段时间后直接退出,其实这样做相对来说是不合理的。
解决办法:自己琢磨出了一个解决办法,不依靠tgt的过期时间,只看session的过期时间,根据session的过期时间策略执行系统的退出。将cas-server的tgt时间设置到2个小时,即默认时间或者更大。这时需要修改的内容如下:
1)、在子应用中分别添加shiro的session销毁监听器,在监听器中设置一个缓存标识。例如timeout:1。
2)、在子应用登录拿着ticket去cas-server服务端校验地方进行修改,先判断缓存中是否有这个标识,如果有则直接返回null
3)、当再次点击系统菜单时,会触发shiro的过滤器,在过滤中同时添加这个标识,当发现标识有时,直接执行subject退出动作,之后shiro会重定向到cas-server端的退出地址上,即:http://localhost:8080/cas/logout,从而让cas-server端执行单点退出流程。
该方法还没有进行具体的实践,在实现时可能会有其他的地方出现。以上信息只是本人自己整理出来,如有错误欢迎指正,也可加QQ:734108708进行沟通交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值