1. 程式人生 > >CAS Shiro做單點登入不能退出的問題

CAS Shiro做單點登入不能退出的問題

CAS3.4版本已經很好的支援了單點登出功能,效果是非常的棒,配置是相當的簡單。

之前版本因為在CAS伺服器通過HttpClient傳送訊息時並未指定為POST方式,所以在CAS客戶端的登出Filter中沒有收到POST請求也就沒有做session銷燬處理。

現在的版本只要按照官網的說明正確配置即可。

假設環境如下:

兩個業務系統APP1和APP2

在沒有配置單點退出時,效果是這樣子的

1:登入APP1,然後經過CAS認證後進入APP1

再訪問APP2無需要認證

2:在APP1中連線到cas的logout地址,現象登出成功介面,然後再訪問APP1,還是可以進去的,因為APP1將使用者的登入票據存入了session。

那麼實現了單點退出後的效果應該是這樣子的:

1:登入APP1,然後經過CAS認證後進入APP1

再訪問APP2無需要認證

2:使用者在APP1或者APP2點選登出,顯示CAS的登出成功頁面,然後再訪問APP1或者APP2都需要再次認證。

具體配置為:

在APP1和APP2的web.xml檔案中增加:

         <listener>
		<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
	</listener>
	<filter>
		<filter-name>singleSignOutFilter</filter-name>
		<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>singleSignOutFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

登出的Filter要在其它Filter之前

完事

備註:如果直接訪問CAS的logout話,會出現登出成功頁面,其實大部分情況下這個頁面是沒有必要的,更多的需求可能是退出後顯示登入頁面,並且登入成功後還是會進入到之前的業務系統,那麼可以修改cas-servlet.xml檔案,在"logoutController"的bean配置中增加屬性“followServiceRedirects”,設定為“true”,然後在業務系統的登出連線中加入"service引數",值為業務系統的絕對URL,這樣就OK了,如你的業務系統URL為:http://localhost:8080/casClient,那麼登出URL就為:

http://localhost:8080/cas/logout?service=http://localhost:8080/casClient

<bean id="logoutController" class="org.jasig.cas.web.LogoutController"
  p:centralAuthenticationService-ref="centralAuthenticationService"
  p:logoutView="casLogoutView"
  p:warnCookieGenerator-ref="warnCookieGenerator"
  p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator"
  p:followServiceRedirects="true"
  />

登出按鈕

<a href="http://localhost:8080/cas/logout?service=http://localhost:8080/casClient">登出</a>

轉載自:CAS 3.4 單點退出詳細配置(Configuring Single Sign Out )