SpringSession系统对接CAS遇到的反序列化问题
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遇到的反序列化问题相关推荐
- PHP使用phpCAS对接CAS单点登陆系统
PHP使用phpCAS对接CAS单点登陆系统 综述 `CAS`单点登陆原理 搭建`CAS SSO`SERVER服务端 下载`phpCAS`客户端 phpCAS客户端配置 PHP开发对接 注意 综述 本 ...
- 03 - vulhub - Apereo CAS 4.1 反序列化命令执行漏洞
文章目录 漏洞名称:Apereo CAS 4.1 反序列化命令执行漏洞 影响版本 漏洞原理 漏洞复现 环境准备 漏洞检测 漏洞利用 验证漏洞利用是否成功 修复建议 漏洞名称:Apereo CAS 4. ...
- 集成底座与业务系统对接过程梳理
集成底座作为企业信息化的基础架构平台,主要满足5A管控.主数据治理以及业务集成等需求,通过基础架构的搭建,为企业的信息化建设提供一套全面稳定.标准统一.易于复用.灵活调整的基础环境.集成底座主要包括三 ...
- Apereo CAS 4.1 反序列化 RCE 漏洞复现实验报告
演示视频 Apereo CAS 4.1 反序列化 RCE 漏洞_哔哩哔哩_bilibiliBGM:<芳华慢>+<霜雪千年>(by等什么君)https://www.bilibil ...
- 基于IdentityServer的系统对接微信公众号
业务需求 公司有两个业务系统,A和B,AB用户之间属于多对一的关系,数据库里面也就是两张表,A表有个外键指向B.现在需要实现以下几个功能. A用户扫描B的二维码,填写相关的注册信息,注册完成之后自动属 ...
- webservice 实现与his系统对接_[Share] EDI 及其他常见系统对接技术
近期,有客户提及:你们有没有对接技术相关的介绍,不同系统之间的对接技术,现在企业内部系统比较多,有自主开发的,有外部采购的,所以我们想了解一下对接技术相关的信息. 小知马不停蹄的做了下功课, 整理了相 ...
- 服务器物理链路,【交换机在江湖对接案例】配置堆叠系统对接NLB服务器群集示例(通过物理链路环回方法)...
配置堆叠系统对接NLB服务器群集示例(通过物理链路环回方法) 设备通过物理链路环回方法对接NLB服务器群集简介 NLB是微软在Windows Server上开发的多服务器群集负载均衡特性.交换机与NL ...
- (原创)面向对象的系统对接接口编写。第4篇
接上一篇:http://www.cnblogs.com/mazhiyuan/p/5224050.html 这篇开始写Post和Get请求的布局. 我们就以新闻模块来举例吧.其它的模块,比如用户啦,比如 ...
- 系统对接方案_一个呼叫中心系统组建的案例
方案简介:本方案主要与客户业务系统进行对接集成 客户后台系统,主要应用在云上,坐席在使用过程中进行业务数据操作打开云上的业务系统,新组建的备载呼叫系统可以在用户本地(方案一)也可以云上(方案二),新组 ...
最新文章
- 多地通知!防止疫情反扑将控制教职工和学生外出,新一轮校园封闭要开始了?...
- 二分图-匈牙利算法模板
- (63)0环与3环通信非常规方式 —— 0环InlineHook
- java 矩阵求逆_java实现的顺时针/逆时针打印矩阵操作示例
- 每秒10W次高并发订单业务,你怎么实现?
- error-2016-2-15
- 来自山西机器人乐队_格力:中国第一支工业机器人乐队重磅亮相
- MongoDB学习笔记(二)
- 挑战程序员同学,如何只用2GB内存从20/40/80亿个整数中找到出现次数最多的数?
- 浅谈在基本数据包装类中使用'=='与equals的区别
- input reset 重置时间
- CCNA配置试验之八 帧中继——点到点子接口(point-to-point)的配置
- jQuery验证框架(五)验证器
- 配置php apache,apache如何配置php
- 新stem编程scratch3水果钢琴创意键盘兼容MakeyMakey开源国产盒装使用教程
- cmos和ttl_TTL与CMOS详细介绍
- 微信公众平台开发(1)--账号注册流程图文详解
- Matlab 常用快捷键
- 系统安全 - windowns系统镜像下载
- 共享充电宝的优点有哪些
热门文章
- 什么是Node.js?
- 自清洗过滤器如何正确选型及其应用领域
- MySQL优化Timeout: Pool empty. Unable to fetch a connection in 30 seconds, none available
- Element在chrome浏览器下table表头不对齐问题解决
- 三层网络PPS极限测试
- B站、知乎、豆瓣:殊途同归?
- Arduino Uno 学习第一课,编程准备
- GNU make 中文手册 第三章:Makefile 总述
- IntelliJ IDEA实用插件
- 万字长文:2020智源大会总结-多角度看AI的未来