SpringSession系统对接CAS遇到的反序列化问题

1、业务背景

业务背景:最近在对接CAS单点登录,遇到一个问题,加班到凌晨,先描述一下背景,首先公司的系统是基于Spring Session做的单点登录,目的是引用Spring Session实现会话共享,然后最近接到需求,要对接另外一个公司的CAS单点登录系统,也就是说自己公司内部多个子系统直接通过Spring session实现单点登录,然后再对接一个第三方公司的单点登录,听起来有点像非常规操作。

这个对接也就是自己的spring Session体系的系统作为一个cas client主体,然后再去对接CAS

2、单点登录

单点登录(Single sign on),英文名称缩写SSO,SSO的意思就是在多系统的环境中,登录单方系统,就可以在不用再次登录的情况下访问相关受信任的系统。也就是说只要登录一次单体系统就可以。

3、CAS单点登录

CAS(Center Authentication Service)是耶鲁大学研究的一款开源的单点登录项目,主要为web项目提供单点登录实现,属于Web SSO。然后,需要先了解CAS单点登录,按照CAS的规范进行对接,cas的资料可以参考我之前的:CAS单点登录系列博客

CAS官网资料:

  • CAS Github链接
  • Apereo CAS官方网站

CAS体系结构分为CAS Server和CAS Client。

CAS Server就是Cas开源的,需要去github下载,然后进行修改;Cas Client
可以是App或者web端的或者PC端,CAS支持多种开发语言,java、php、C#等等


PS:图来自官网,这里简单介绍一下,从图可以看出,CAS支持多种方式的认证,一种是LDAP的、比较常见的数据库Database的JDBC,还有Active Directory等等;支持的协议有Custom Protocol 、 CAS 、 OAuth 、 OpenID 、 RESTful API 、 SAML1.1 、 SAML2.0 等

下面给出一张来自CAS官方的图片

CAS登录等系统分为CAS Server和CAS Client,下面,我根据我的理解稍微解释一下:

1、用户访问CAS Client请求资源

2、客户端程序做了重定向,重定向到CAS Server

3、CAS Server会对请求做认证,验证是否有TGC(Ticket Granted Cookie,有TGC说明已经登录过,不需要再登录,没有就返回登录页面

4、认证通过后会生成一个Service Ticket返回Cas Client,客户端进行Ticket缓存,一般放在Cookie里,我们称之为TGC(Ticket Granted Cookie)

5、然后Cas Client就带着Ticket再次访问Cas Server,CAS Server进行Ticket验证

6、CAS Server对Ticket进行验证,通过就返回用户信息,用户拿到信息后就可以登录

4、原因分析

所以可以先分析一下怎么实现?首先既然是不同公司的登录系统,一般都会有两套的用户体系,所以可以先设计一张用户的关联表,然后两套系统的用户关联关系。按照CAS规范对接之后,我们拿到cas的登录用户账号,从关联表拿出公司系统(基于Spring Session)的用户账号,进行自己内部系统的登录

ok,看起来方案还是比较清晰,不过在上线后,出现麻烦的问题,就是自己的登录包登录之后,登录包拿到cas的用户之后,再取关联用户数据去进行内部系统的springSession单点登录之后,这个包是正常,不过在其它war包系统进行登录,发现,springsession,session对象都获取不到,一直抛异常,redis序列化失败,ClassNotFoundException?

org.springframework.data.redis.serializer.SerializationException: Cannot deseria
lize; nested exception is org.springframework.core.serializer.support.Serializat
ionFailedException: Failed to deserialize payload. Is the byte array a result of
corresponding serialization for DefaultDeserializer?; nested exception is org.s
pringframework.core.NestedIOException: Failed to deserialize object type; nested
exception is java.lang.ClassNotFoundException: org.jasig.cas.client.validation.
AssertionImpl
at org.springframework.data.redis.serializer.JdkSerializationRedisSerial
izer.deserialize(JdkSerializationRedisSerializer.java:41)
at org.springframework.data.redis.core.AbstractOperations.deserializeHas
hValue(AbstractOperations.java:316)
at org.springframework.data.redis.core.AbstractOperations.deserializeHas
hMap(AbstractOperations.java:277)
at org.springframework.data.redis.core.DefaultHashOperations.entries(Def
aultHashOperations.java:227)
at org.springframework.data.redis.core.DefaultBoundHashOperations.entrie
s(DefaultBoundHashOperations.java:101)

然后纠结想了很久,没找到原因,后来部门老大找到方法,就是在tomcat lib下面丢一下cas-client-core.jar

原因是什么?首先要对Spring session有一定了解,非spring session项目,Session的管理一般是给中间件,比如tomcat、weblogic等等进行管理的,而引用SpringSession项目后,Session管理给框架实现,然后会将数据同步到redis,也就是我们使用了setSession,数据都会同步到redis

同时,我们也要熟悉CAS,可以找cas client源码里找到如下代码:代码里将一个对象丢到里Session里

所以,就可以知道在知道原因了,我们分析一下:在对接CAS时,在过滤器里,我们将AssertionImpl这个对象丢到了Session里,然后经过springSession管理的项目,就有问题,可以先在cas源码里找到哪里进行了setSession

org.jasig.cas.client.jaas.Servlet3AuthenticationFilter

org.jasig.cas.client.validation.AbstractTicketValidationFilter.java:

ok,本博客进行比较浅显的分析,先做好记录,日后有时间再看看源码实现

5、附录资料

CAS官网资料:

  • CAS Github链接
  • Apereo CAS官方网站

SpringSession系统对接CAS遇到的反序列化问题相关推荐

  1. PHP使用phpCAS对接CAS单点登陆系统

    PHP使用phpCAS对接CAS单点登陆系统 综述 `CAS`单点登陆原理 搭建`CAS SSO`SERVER服务端 下载`phpCAS`客户端 phpCAS客户端配置 PHP开发对接 注意 综述 本 ...

  2. 03 - vulhub - Apereo CAS 4.1 反序列化命令执行漏洞

    文章目录 漏洞名称:Apereo CAS 4.1 反序列化命令执行漏洞 影响版本 漏洞原理 漏洞复现 环境准备 漏洞检测 漏洞利用 验证漏洞利用是否成功 修复建议 漏洞名称:Apereo CAS 4. ...

  3. 集成底座与业务系统对接过程梳理

    集成底座作为企业信息化的基础架构平台,主要满足5A管控.主数据治理以及业务集成等需求,通过基础架构的搭建,为企业的信息化建设提供一套全面稳定.标准统一.易于复用.灵活调整的基础环境.集成底座主要包括三 ...

  4. Apereo CAS 4.1 反序列化 RCE 漏洞复现实验报告

    演示视频 Apereo CAS 4.1 反序列化 RCE 漏洞_哔哩哔哩_bilibiliBGM:<芳华慢>+<霜雪千年>(by等什么君)https://www.bilibil ...

  5. 基于IdentityServer的系统对接微信公众号

    业务需求 公司有两个业务系统,A和B,AB用户之间属于多对一的关系,数据库里面也就是两张表,A表有个外键指向B.现在需要实现以下几个功能. A用户扫描B的二维码,填写相关的注册信息,注册完成之后自动属 ...

  6. webservice 实现与his系统对接_[Share] EDI 及其他常见系统对接技术

    近期,有客户提及:你们有没有对接技术相关的介绍,不同系统之间的对接技术,现在企业内部系统比较多,有自主开发的,有外部采购的,所以我们想了解一下对接技术相关的信息. 小知马不停蹄的做了下功课, 整理了相 ...

  7. 服务器物理链路,【交换机在江湖对接案例】配置堆叠系统对接NLB服务器群集示例(通过物理链路环回方法)...

    配置堆叠系统对接NLB服务器群集示例(通过物理链路环回方法) 设备通过物理链路环回方法对接NLB服务器群集简介 NLB是微软在Windows Server上开发的多服务器群集负载均衡特性.交换机与NL ...

  8. (原创)面向对象的系统对接接口编写。第4篇

    接上一篇:http://www.cnblogs.com/mazhiyuan/p/5224050.html 这篇开始写Post和Get请求的布局. 我们就以新闻模块来举例吧.其它的模块,比如用户啦,比如 ...

  9. 系统对接方案_一个呼叫中心系统组建的案例

    方案简介:本方案主要与客户业务系统进行对接集成 客户后台系统,主要应用在云上,坐席在使用过程中进行业务数据操作打开云上的业务系统,新组建的备载呼叫系统可以在用户本地(方案一)也可以云上(方案二),新组 ...

最新文章

  1. 多地通知!防止疫情反扑将控制教职工和学生外出,新一轮校园封闭要开始了?...
  2. 二分图-匈牙利算法模板
  3. (63)0环与3环通信非常规方式 —— 0环InlineHook
  4. java 矩阵求逆_java实现的顺时针/逆时针打印矩阵操作示例
  5. 每秒10W次高并发订单业务,你怎么实现?
  6. error-2016-2-15
  7. 来自山西机器人乐队_格力:中国第一支工业机器人乐队重磅亮相
  8. MongoDB学习笔记(二)
  9. 挑战程序员同学,如何只用2GB内存从20/40/80亿个整数中找到出现次数最多的数?
  10. 浅谈在基本数据包装类中使用'=='与equals的区别
  11. input reset 重置时间
  12. CCNA配置试验之八 帧中继——点到点子接口(point-to-point)的配置
  13. jQuery验证框架(五)验证器
  14. 配置php apache,apache如何配置php
  15. 新stem编程scratch3水果钢琴创意键盘兼容MakeyMakey开源国产盒装使用教程
  16. cmos和ttl_TTL与CMOS详细介绍
  17. 微信公众平台开发(1)--账号注册流程图文详解
  18. Matlab 常用快捷键
  19. 系统安全 - windowns系统镜像下载
  20. 共享充电宝的优点有哪些

热门文章

  1. 什么是Node.js?
  2. 自清洗过滤器如何正确选型及其应用领域
  3. MySQL优化Timeout: Pool empty. Unable to fetch a connection in 30 seconds, none available
  4. Element在chrome浏览器下table表头不对齐问题解决
  5. 三层网络PPS极限测试
  6. B站、知乎、豆瓣:殊途同归?
  7. Arduino Uno 学习第一课,编程准备
  8. GNU make 中文手册 第三章:Makefile 总述
  9. IntelliJ IDEA实用插件
  10. 万字长文:2020智源大会总结-多角度看AI的未来