1. 程式人生 > >單點登入CAS使用記:關於伺服器超時以及客戶端超時的分析

單點登入CAS使用記:關於伺服器超時以及客戶端超時的分析

我的預想情況

 一般情況下,當用戶登入一個站點後,如果長時間沒有發生任何動作,當用戶再次點選時,會被強制登出並且跳轉到登入頁面,

提醒使用者重新登入。現在我已經為站點整合了CAS,並且已經實現了單點登入以及單點登出,那麼當用戶使用過程中,發生了超時的情況,

估計也是自動的強行登出了吧,而且可能其他部署了Cas的站點也跟著自動登出了。
 

我是這麼猜想的。

 

那麼實際情況到底是什麼樣的

首先先列出我自己開發過程中的遇到的一系列疑問:

1.Cas-Client超時後發生了什麼?

2.Cas-Server超時後發生了什麼?

3.Cas-Client與Cas-Server超時時間分別該怎麼設定才比較好?

4.一個站點超時,其他站點集中被登出了嗎?

 

下面來驗證一下實際情況

1.Cas-Client超時後發生了什麼?

Cas-Client客戶端其實不需要額外做超時的配置,因為是在原有專案的web.xml中配置,說白了就是原專案的一部分,

所以以原專案設定的超時時間為準。

一般情況都是在web.xml中這麼設定的:

<session-config>
        <session-timeout>120</session-timeout>
    </session-config>

驗證方法:

事前準備:

  1.把webApp1的超時時間設定為1分鐘,webApp2不做修改,超時時間為2小時,CAS-Server預設超時時間也是2小時

  2.啟動CAS-Server、webApp1、webApp2

  3.分別登入webApp1、webApp2

驗證動作:

  2分鐘後,我優先點選webApp1的網頁,彷彿沒有發生任何與超時相關的處理,依然可以正常訪問所有頁面。並沒有強制跳轉到登入頁。我再點選webApp2的網頁,也可以正常瀏覽。

  又過了2分鐘,我優先點選webApp2的網頁,可以正常訪問。再次點選webApp1,也可以正常訪問。

驗證結果:

  1.webApp1雖然超時了,但是並沒有被強制登出,依然可以正常訪問。

  2.webApp2完全沒有受到webApp1的超時影響,也可以正常訪問。

原因分析:

...編寫中

 

 2.Cas-Server超時後發生了什麼?

cas服務端超時應該主要指的是TGT(ticket granting ticket)超時,如果TGT時間到期,則需要進行重新登入。這裡時間單位是毫秒,預設是兩小時。

ticketExpirationPolicies.xml

<bean id="grantingTicketExpirationPolicy" class="org.jasig.cas.ticket.support.TimeoutExpirationPolicy">
        <!-- This argument is the time a ticket can exist before its considered expired.  -->
        <constructor-arg
            index="0"
            value="7200000" />
    </bean>

驗證方法:

事前準備:

  1.CAS-Server預設超時時間也是2分鐘,webApp1的超時時間設定為5分鐘、webApp2的超時時間設定為10分鐘。

  2.啟動CAS-Server、webApp1、webApp2

  3.分別登入webApp1、webApp2

驗證動作:

  3分鐘後,CAS-Server應該已經超時了,這時我訪問webApp1,可以正常訪問。訪問webApp2,也可以正常訪問。

  6分鐘後,CAS-server與webApp1應該都超時了,這時訪問webApp1,頁面被強制重定向到登入頁面了。再訪問webApp2,發現仍然可以正常訪問。

  11分鐘後,webApp2頁超時了,這時訪問webApp2,頁面就被重定向到登入頁面了。

驗證結果:

  1.CAS-Server的TGT超時,並不會影響到頁面的正常訪問,也就是說TGT超時後,並沒有主動的銷燬客戶端的Session。

  2.只有當TGT超時後,並且客戶端也超時了,這時候客戶端才會主動向Cas-Server重新發起請求認證,然後發現TGT超時了,所以重定向回登入頁面。

  3.一個客戶端超時並不會影響其他客戶端的正常訪問。

原因分析:

 ...編寫中

 

 3.Cas-Client與Cas-Server超時時間分別該怎麼設定才比較好?

 從以上兩個驗證可以發現,一旦客戶端通過了CAS-Server認證後,客戶端就相當於完全獨立了,即使再訪問客戶端的頁面,客戶端與CAS-Server之間也不在發生任何互動或者驗證動作。

一直到客戶端強制登出或者超時後,才會主動發起認證請求,CAS-Server才會被動的處理請求,判斷是需要重定向還是重新認證通過。

也就是說,如果服務端超時時間設定的過短,並不會起作用,還是要等客戶端超時後才行。

 

鑑於以上,客戶端與服務端的超時時間應該設定為:

CAS-Server(TGT)超時時間  >=  Cas-Client的超時時間

 

4.一個站點超時,其他站點集中被登出了嗎?

從之前的驗證來看,一個站點超時,並不影響其他站點的正常訪問。