开门见山,如下图为cas登录的序列图
cas实现单点登录的主要票据有两个,一个是TGT,一个是ST。
因为是做单点登录的,所以客户端应该是有多个的,当其中一个登录之后,在同一浏览器中在登陆其他客户端用户是感知不到再次登录的,原因是第一次登录成功后cookie记录一个TGT,这个cookie在浏览器中是共享的,客户端可以携带TGT的cookie请求服务端,然后服务端校验TGT以及请求的服务,如果通过的话会生成对应服务的一个ST票据,客户端生成session以及ST与session的对应关系,下次请求这个服务只需要校验session即可;
在工作时遇到一个服务多活情况下单点登出的问题,等一个服务登录成功后会生成session,在多个实例之间session是共享的,但是ST与session的对应关系只有登录成功那个实例有保存。在说一下cas的单点登出的逻辑,在回头看前一句,单点登出为访问cas服务端的logout接口,里面的逻辑为遍历所有注册的客户端的url,携带ST ,让每一个客户端都做登出逻辑,在客户端中通过ST找到对应的session注销并清除ST 与session的对应关系,之前说过了,只有登录成功的实例才有保存ST与session的对应关系,所以当访问到未保存的实例时,登出失败。我们的解决方案是通过共享缓存来自己实现保存ST与session的对应关系,修改一下cas客户端登出的逻辑,(实现一个SessionMappingStorage接口,并set到SingleSignOutFilter中即可)这样就不会有问题了。
cas的流程看服务端的 login-webflow.xml 中的流程,梳理几遍就会弄懂里面的逻辑。
源码讲解可以参考下这个博客:https://blog.csdn.net/dovejing/article/details/44523545