亞寵展、全球?qū)櫸锂a(chǎn)業(yè)風(fēng)向標(biāo)——亞洲寵物展覽會(huì)深度解析
1100
2022-05-30
springSession系統(tǒng)對(duì)接CAS遇到的反序列化問(wèn)題
1、業(yè)務(wù)背景
業(yè)務(wù)背景:最近在對(duì)接CAS單點(diǎn)登錄,遇到一個(gè)問(wèn)題,加班到凌晨,先描述一下背景,首先公司的系統(tǒng)是基于Spring Session做的單點(diǎn)登錄,目的是引用Spring Session實(shí)現(xiàn)會(huì)話共享,然后最近接到需求,要對(duì)接另外一個(gè)公司的CAS單點(diǎn)登錄系統(tǒng),也就是說(shuō)自己公司內(nèi)部多個(gè)子系統(tǒng)直接通過(guò)Spring session實(shí)現(xiàn)單點(diǎn)登錄,然后再對(duì)接一個(gè)第三方公司的單點(diǎn)登錄,聽(tīng)起來(lái)有點(diǎn)像非常規(guī)操作。
這個(gè)對(duì)接也就是自己的spring Session體系的系統(tǒng)作為一個(gè)cas client主體,然后再去對(duì)接CAS
2、單點(diǎn)登錄
單點(diǎn)登錄(Single sign on),英文名稱(chēng)縮寫(xiě)SSO,SSO的意思就是在多系統(tǒng)的環(huán)境中,登錄單方系統(tǒng),就可以在不用再次登錄的情況下訪問(wèn)相關(guān)受信任的系統(tǒng)。也就是說(shuō)只要登錄一次單體系統(tǒng)就可以。
3、CAS單點(diǎn)登錄
CAS(Center Authentication Service)是耶魯大學(xué)研究的一款開(kāi)源的單點(diǎn)登錄項(xiàng)目,主要為web項(xiàng)目提供單點(diǎn)登錄實(shí)現(xiàn),屬于Web SSO。然后,需要先了解CAS單點(diǎn)登錄,按照CAS的規(guī)范進(jìn)行對(duì)接,cas的資料可以參考我之前的:CAS單點(diǎn)登錄系列博客
CAS官網(wǎng)資料:
CAS Github鏈接
Apereo CAS官方網(wǎng)站
CAS體系結(jié)構(gòu)分為CAS Server和CAS Client。
CAS Server就是Cas開(kāi)源的,需要去github下載,然后進(jìn)行修改;Cas Client
可以是App或者web端的或者PC端,CAS支持多種開(kāi)發(fā)語(yǔ)言,java、php、C#等等
PS:圖來(lái)自官網(wǎng),這里簡(jiǎn)單介紹一下,從圖可以看出,CAS支持多種方式的認(rèn)證,一種是LDAP的、比較常見(jiàn)的數(shù)據(jù)庫(kù)Database的JDBC,還有Active Directory等等;支持的協(xié)議有Custom Protocol 、 CAS 、 OAuth 、 OpenID 、 RESTful API 、 SAML1.1 、 SAML2.0 等
下面給出一張來(lái)自CAS官方的圖片
CAS登錄等系統(tǒng)分為CAS Server和CAS Client,下面,我根據(jù)我的理解稍微解釋一下:
1、用戶訪問(wèn)CAS Client請(qǐng)求資源
2、客戶端程序做了重定向,重定向到CAS Server
3、CAS Server會(huì)對(duì)請(qǐng)求做認(rèn)證,驗(yàn)證是否有TGC(Ticket Granted Cookie,有TGC說(shuō)明已經(jīng)登錄過(guò),不需要再登錄,沒(méi)有就返回登錄頁(yè)面
4、認(rèn)證通過(guò)后會(huì)生成一個(gè)Service Ticket返回Cas Client,客戶端進(jìn)行Ticket緩存,一般放在Cookie里,我們稱(chēng)之為T(mén)GC(Ticket Granted Cookie)
5、然后Cas Client就帶著Ticket再次訪問(wèn)Cas Server,CAS Server進(jìn)行Ticket驗(yàn)證
6、CAS Server對(duì)Ticket進(jìn)行驗(yàn)證,通過(guò)就返回用戶信息,用戶拿到信息后就可以登錄
4、原因分析
所以可以先分析一下怎么實(shí)現(xiàn)?首先既然是不同公司的登錄系統(tǒng),一般都會(huì)有兩套的用戶體系,所以可以先設(shè)計(jì)一張用戶的關(guān)聯(lián)表,然后兩套系統(tǒng)的用戶關(guān)聯(lián)關(guān)系。按照CAS規(guī)范對(duì)接之后,我們拿到cas的登錄用戶賬號(hào),從關(guān)聯(lián)表拿出公司系統(tǒng)(基于Spring Session)的用戶賬號(hào),進(jìn)行自己內(nèi)部系統(tǒng)的登錄
ok,看起來(lái)方案還是比較清晰,不過(guò)在上線后,出現(xiàn)麻煩的問(wèn)題,就是自己的登錄包登錄之后,登錄包拿到cas的用戶之后,再取關(guān)聯(lián)用戶數(shù)據(jù)去進(jìn)行內(nèi)部系統(tǒng)的springSession單點(diǎn)登錄之后,這個(gè)包是正常,不過(guò)在其它war包系統(tǒng)進(jìn)行登錄,發(fā)現(xiàn),springsession,session對(duì)象都獲取不到,一直拋異常,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)
…
然后糾結(jié)想了很久,沒(méi)找到原因,后來(lái)部門(mén)老大找到方法,就是在tomcat lib下面丟一下cas-client-core.jar
原因是什么?首先要對(duì)Spring session有一定了解,非spring session項(xiàng)目,Session的管理一般是給中間件,比如tomcat、weblogic等等進(jìn)行管理的,而引用SpringSession項(xiàng)目后,Session管理給框架實(shí)現(xiàn),然后會(huì)將數(shù)據(jù)同步到redis,也就是我們使用了setSession,數(shù)據(jù)都會(huì)同步到redis
同時(shí),我們也要熟悉CAS,可以找cas client源碼里找到如下代碼:代碼里將一個(gè)對(duì)象丟到里Session里
所以,就可以知道在知道原因了,我們分析一下:在對(duì)接CAS時(shí),在過(guò)濾器里,我們將AssertionImpl這個(gè)對(duì)象丟到了Session里,然后經(jīng)過(guò)springSession管理的項(xiàng)目,就有問(wèn)題,可以先在cas源碼里找到哪里進(jìn)行了setSession
org.jasig.cas.client.jaas.Servlet3AuthenticationFilter
org.jasig.cas.client.validation.AbstractTicketValidationFilter.java:
ok,本博客進(jìn)行比較淺顯的分析,先做好記錄,日后有時(shí)間再看看源碼實(shí)現(xiàn)
5、附錄資料
CAS官網(wǎng)資料:
CAS Github鏈接
Apereo CAS官方網(wǎng)站
Spring
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。