CAS实现同帐号当前登录成功踢出前一登录终端(单用户登录)

本文介绍了在使用CAS4.1.10作为单点登录中心时遇到的账号复用导致的单点登出失败问题。通过分析问题根源,即TGT与ST关联关系被覆盖,提出了禁止账号复用的解决方案,实现单用户登录。具体做法是修改TGT与ST的关联方式,添加用户名和TGT的对应关系,并调整获取TGT的方法,确保安全性。经过测试,该方案成功实现了当同一账号在另一设备登录时,原有设备被踢出的效果。
摘要由CSDN通过智能技术生成

公司应用线很多,使用CAS4.1.10作为单点登录中心,自己实现了单点登出功能,但是发现CAS在发生账号复用的时候会产生单点登出失败的问题。

名词解释:TGT:TicketGrantingTicket;ST:ServiceTicket

表现为:A在自己电脑上使用001帐号登录了数个应用,此后B也在自己的电脑上使用001帐号登录了数个应用;此后A的电脑上的应用将出现无法单点登出的问题。原因是登出时将注销ST并销毁TGT,TGT销毁时将发送注销通知给所有关联的ST实现单点登出。账号复用后,CAS在颁发ST的时候将会出现ST和TGT的关联关系被覆盖的现象,导致:A电脑上的注销操作注销ST,但ST关联关系已经被覆盖至B电脑的TGT,结果销毁TGT没有成功,没有响应单点登出。

另一种问题表现形式是:账号复用后,A电脑上的登出操作将导致B电脑上的TGT同时被销毁,同一账号的不同TGT同时触发注销程序,注销通知发生回环(类似麦克风的回音),最终导致A、B两台电脑均无法正常使用。直至A、B双方都关闭浏览器终端,终止通知回环。


解决方案:账号复用导致的问题原因在于TGT和ST的关联关系,如果想要允许复用的话,需要自己建立一个关联方式取代CAS原有的关联即可(也许需要改动的地方不少,没细看)。我们的方案是禁止账号复用,即需要实现单用户登录,所以需要通过修改实现A电脑登录之后再去B电脑登录,A电脑即被踢出。

实现方案:

经过跟踪排查,管理登录时TGT与ST颁发的代码内容均在

org.jasig.cas.CentralAuthenticationServiceImpl

这个类当中。

而管理和记录TGT和ST并记录关联的内容均在

org.jasig.cas.ticket.registry.DefaultTicketRegistry
这个类当中。

不要怂,就是刚,抄起键盘就是干!

研究了一圈,发现能添加TGT的地方有不止一处,为了以后扩展方便(少找麻烦),不去动它们,那就只能在它们汇总的地方做文章了。

org.jasig.cas.ticket.registry.DefaultTicketRegistry
import org.jasig.cas.ticket.ServiceTicket;
import org.jasig.cas.ticket.Ticket;
import org.jasig.cas.ticket.TicketG
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值