关于cas server无法通过session持久化方式实现集群的问题
最近在搭建cas单点登录系统 ,在建立集群时发生一个问题。
搭建的环境是tomcat+tomcat-redis-session-manager+redis+cas
在对tomcat的session进行持久化时,cas系统的登录流程被打断,无法进行完整的登录流程。
经过几天的钻研,发现问题出在cas server登录流程中的spring web flow流程这一块。
大致问题如下:
spring web flow里面跟session进行了绑定操作,conversation这个对象里面存在的对象,嵌套了很多对象,跟session进行绑定的时候直接从session中获取conversation,然后直接修改了conversation之后没有将conversation对象再回放到session中,所以session如果持久化了,webFlow再进行下一个流程从数据库里取session数据就会找不到这个数据,找不到这个数据的后果就是整个webflow流程无法继续进行。
所以如果session的实现类是操作jvm的内存的话是没有问题,因为取出来之后直接修改就是修改的最真实的对象。但是现在的方案是将session中的值都存在redis中,webFlow代码中很多地方都是直接从session中取值然后进行修改,最终无法体现到redis中,所以会出现登录流程走不通的问题。
最近发现目前cas源代码太过臃肿,估计是换了一批有一批开发人员维护的原因;每个维护人员的代码风格都不一样,导致源代码修改难度不小;虽然cas那么多年在通用性上面做的还不错,现在的问题就是对集群支持不足。
解决方案:
1、使用组播方式实现session复制(session无法持久化,依旧存放在jvm内存中,并且session复制效率较低,可作为暂时性方案)
2、重新实现cas的登录流程(绕过web-flow登录流程即可,对cas-core源代码足够熟悉可以采用此方案)
3、使用其他第三方SSO框架或者自己实现一套单点登录系统(推荐此方案)
本文来自博客园,作者:eguid,没有作者允许禁止转载,取得作者同意后转载需注明作者名和原文链接:https://www.cnblogs.com/eguid/p/6821620.html