SpringSession系統(tǒng)對(duì)接CAS遇到的反序列化問(wèn)題

      網(wǎng)友投稿 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鏈接

      SpringSession系統(tǒng)對(duì)接CAS遇到的反序列化問(wèn)題

      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)容。

      上一篇:C++全局變量與局部變量初始化的問(wèn)題及存儲(chǔ)類(lèi)修飾符
      下一篇:BlockChain:區(qū)塊鏈技術(shù)基礎(chǔ)概念綜合理解——個(gè)人總結(jié)
      相關(guān)文章
      亚洲网站视频在线观看| 亚洲AV无码一区二区三区在线| 亚洲欧洲尹人香蕉综合| 亚洲av午夜福利精品一区| 亚洲综合AV在线在线播放| 亚洲成人高清在线| 亚洲av区一区二区三| 亚洲高清偷拍一区二区三区| 亚洲Aⅴ无码一区二区二三区软件| 亚洲精品国产首次亮相| 亚洲成a∧人片在线观看无码| 亚洲欧好州第一的日产suv| 亚洲日韩精品国产3区| 亚洲精品国产综合久久久久紧| 亚洲s码欧洲m码吹潮| 亚洲s码欧洲m码吹潮| 国产亚洲欧美日韩亚洲中文色| 亚洲AV无码一区二区大桥未久| 豆国产96在线|亚洲| 亚洲А∨精品天堂在线| 亚洲人成网站观看在线播放| 亚洲色偷偷狠狠综合网| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲综合激情五月丁香六月| 亚洲欧洲无码AV不卡在线| 亚洲第一综合天堂另类专| 国产成人亚洲午夜电影| 亚洲国产小视频精品久久久三级 | 国产亚洲一区二区在线观看| 久久精品国产亚洲av麻| 亚洲精品在线网站| 亚洲中文字幕人成乱码| 亚洲中文字幕乱码一区| 国产精品国产亚洲区艳妇糸列短篇| 亚洲av无码国产精品色在线看不卡 | 亚洲一区动漫卡通在线播放| 亚洲日韩精品无码专区加勒比 | jizzjizz亚洲日本少妇| 亚洲中文字幕丝袜制服一区| 国产亚洲综合色就色| 亚洲首页在线观看|