关于cas server无法通过session持久化方式实现集群的问题



最近在搭建cas单点登录系统 ,在建立集群时发生一个问题。

搭建的环境是tomcat+tomcat-redis-session-manager+redis+cas

在对tomcat的session进行持久化时,cas系统的登录流程被打断,无法进行完整的登录流程。

经过几天的钻研,发现问题出在cas server登录流程中的spring web flow流程这一块。

大致问题如下:

客户端和CAS服务端都用了Redis集群,登陆都是OK的,超时也是可以正常跳出重新正常登陆,但是单点登出后却无法正常登入,做了如下配置:
1、CAS服务端使用了RedisTicketRegistry 对ticket进行了存储改造,tomcat中配置了session同步:
<Valve className="com.orangefunction.tomcat6.redissessions.RedisSessionHandlerValve"/>
<Manager className="com.orangefunction.tomcat6.redissessions.RedisSessionManager" host="" port="6379" database="0" maxInactiveInterval="120"/>
2、客户端中tomcat配置了session同步:
<Valve className="com.orangefunction.tomcat6.redissessions.RedisSessionHandlerValve"/>
<Manager className="com.orangefunction.tomcat6.redissessions.RedisSessionManager" host="" port="6379" database="1" maxInactiveInterval="120"/>
但是单点登出后却无法正常登入,报错NoSuchFlowExecutionException:
No flow execution could be found with key flowExecutionKey -- perhaps this executing flow has ended or expired?
This could happen if your users are relying on browser history (typically via the back button) that references ended flows
分析结论:

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框架或者自己实现一套单点登录系统(推荐此方案)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值