1. 程式人生 > >Spring Security與CAS原理 SSO

Spring Security與CAS原理 SSO

原文:https://blog.csdn.net/cruise_h/article/details/51013597

https://blog.csdn.net/weixin_42813765/article/details/82315305

https://www.cnblogs.com/codestory/p/5512104.html

Spring Security與CAS結合使用的意義

web應用中一個登陸過程,其實就是完成認證與授權。

所謂認證,就是當用戶試圖進入系統,而系統發現使用者沒有登陸,就調轉到登陸頁面。

所謂授權,指使用者認證通過之後對該使用者賦許可權,即該使用者能夠訪問這個系統的哪些功能(即該使用者能夠訪問這個系統的哪些url地址及按鈕)

Cas它的功能就是進行使用者名稱密碼認證。如果spring security與cas整合,就相當於spring security自身的登入認證功能轉移到cas框架上,然後spring security進行認證之後的授權。

CAS原理和協議

基礎模式

基礎模式SSO訪問流程主要有以下步驟:

1. 訪問服務:SSO客戶端傳送請求訪問應用系統提供的服務資源。

2. 定向認證:SSO客戶端會重定向使用者請求到SSO伺服器。

3. 使用者認證:使用者身份認證。

4. 發放票據:SSO伺服器會產生一個隨機的Service Ticket。

5. 驗證票據:SSO伺服器驗證票據Service Ticket的合法性,驗證通過後,允許客戶端訪問服務。

6. 傳輸使用者資訊:SSO伺服器驗證票據通過後,傳輸使用者認證結果資訊給客戶端。

如上圖:CAS Client 與受保護的客戶端應用部署在一起,以Filter方式保護Web應用的受保護資源,過濾從客戶端過來的每一個Web請求,同時,CAS Client 會分析HTTP請求中是否包含請求Service Ticket( ST上圖中的Ticket) ,如果沒有,則說明該使用者是沒有經過認證的;於是CAS Client 會重定向使用者請求到 CAS Server(Step 2),並傳遞Service(要訪問的目的資源地址)。 Step 3是使用者認證過程,如果使用者提供了正確的Credentials, CAS Server隨機產生一個相當長度、唯一、不可偽造的Service Ticket,並快取以待將來驗證,並且重定向使用者到Service 所在地址(附帶剛才產生的Service Ticket ), 併為客戶端瀏覽器設定一個Ticket Granted Cookie(TGC)

;CAS Client 在拿到Service和新產生的 Ticket過後,在Step 5和Step6中與CAS Server進行身份核實,以確保 Service Ticket 的合法性。

在該協議中,所有與CAS Server的互動均採用SSL協議,以確保ST和TGC的安全性。協議工作過程中會有兩次重定向的過程。但是 CAS Client與CAS Server之間進行Ticket驗證的過程對於使用者是透明的(使用HttpsURLConnection)。

各服務首次訪問:若使用者沒有登入過執行以下圖全部流程。若以在其他服務中登入則執行到下圖第二步

同服務第二次訪問(因為之前已建立session,所以不會再去cas server)

CAS 如何實現 SSO

當用戶訪問另一個應用的服務再次被重定向到CAS Server的時候,CAS Server會主動獲到這個TGC cookie,然後做下面的事情:

1) 如果User持有TGC且其還沒失效,那麼就走基礎協議圖的Step4,達到了 SSO 的效果;

2) 如果TGC失效,那麼使用者還是要重新認證 (走基礎協議圖的Step3)。

 

 輔助說明

CAS的SSO實現方式可簡化理解為:1個Cookie和N個Session。CAS Server建立cookie,在所有應用認證時使用,各應用通過建立各自的Session來標識使用者是否已登入

使用者在一個應用驗證通過後,以後使用者在同一瀏覽器裡訪問此應用時,客戶端應用中的過濾器會在session裡讀取到使用者資訊,所以就不會去CAS Server認證。如果在此瀏覽器裡訪問別的web應用時,客戶端應用中的過濾器在session裡讀取不到使用者資訊,就會去CAS Server的login介面認證,但這時CAS Server會讀取到瀏覽器傳來的cookie(TGC),所以CAS Server不會要求使用者去登入頁面登入,只是會根據service引數生成一個Ticket,然後再和web應用做一個驗證ticket的互動而已。

Session共享

可以通過Nginx+SpringSession實現Session共享,這樣既可以同步Session資訊,又能使其他應用不用再做首次認證

https://www.cnblogs.com/codestory/p/5512104.html

Cas登入過期時間

1、修改Cas Server的CASTGC過期時間
修改Cas Server下cas/WEB-INF/spring-configuration/ticketExpirationPolicies.xml(CASTGC的過期時間,單位為秒)

<bean id="grantingTicketExpirationPolicy" class="org.jasig.cas.ticket.support.TicketGrantingTicketExpirationPolicy"
     p:maxTimeToLiveInSeconds="28800"
     p:timeToKillInSeconds="1800"/>

2、修改Cas Client的Session過期時間
向Cas Client下WEB-INF/web.xml新增以下程式碼(Session過期時間,單位為分鐘):

     <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

 CAS代理模式

該模式形式為使用者訪問App1,App1又依賴於App2來獲取一些資訊,如:User -->App1 -->App2

這種情況下,假設App2也是需要對User進行身份驗證才能訪問,那麼,為了不影響使用者體驗(過多的重定向導致User的IE視窗不停地閃動),CAS引入了一種Proxy認證機制,即CAS Client可以代理使用者去訪問其它Web應用。

代理的前提是需要CAS Client擁有使用者的身份資訊(類似憑據)。之前我們提到的TGC是使用者持有對自己身份資訊的一種憑據,這裡的PGT就是CAS Client端持有的對使用者身份資訊的一種憑據。憑藉TGC,User可以免去輸入密碼以獲取訪問其它服務的Service Ticket,所以,這裡憑藉PGT,Web應用可以代理使用者去實現後端的認證,而無需前端使用者的參與