
該圖
當一個web 瀏覽器登錄到應用服務器時,應用服務器(application)會監測用戶的session,如果沒有session,則應用服務器會把url跳轉到CAS server上。要求
用戶登錄,用戶登錄成功,CAS server會記住請求的application的url和該用戶的sessionId(在應用服務器跳轉到Url時,通過出參數傳給CAS server).此時在CAS服務器會種下TGC Cookie值到web browser ,擁有該TGC Cookie的web browser 可以無需登錄進入所有建立sso服務的應用服務器application

第二張圖中,當一個web瀏覽器要求退出應用服務器,應用服務器application會把url跳轉到CAS server上的/cas/logout url資源上。
CAS server接受到請求后,會檢測用戶的TGC cookie,把對應的session清除,同時會找到所有通過該TGC sso登錄的應用服務器URL提交請求,所有的回調請求中包含一個參數 logoutRequest。
<samlp:LogoutRequest ID="[RANDOM ID]" Version="2.0" IssueInstant="[CURRENT DATE/TIME]"> <saml:NameID>@NOT_USED@</saml:NameID> <samlp:SessionIndex>[SESSION IDENTIFIER]</samlp:SessionIndex> </samlp:LogoutRequest>
所有收到請求的應用服務器application會解析這個參數,獲取sessionId,根據這個ID獲取session后,把session 刪除。這樣就實現了單點登出功能。
首先,要實現single sign out,在應用服務器application端的web.xml要加入以下配置
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
注意:如果有配置CAS client Filter,則CAS Signle Sign out Filter 必須放在CAS client Filter之前
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {
// 轉換參數
final HttpServletRequest request = (HttpServletRequest) servletRequest;
//判斷參數中是否具有artifactParameterName屬性指定的參數名稱,默認是ticket
if (handler.isTokenRequest(request)) {
// 如果存在,在本地sessionMappingStorage中記錄session。
handler.recordSession(request);
} else if (handler.isLogoutRequest(request)) {//判斷是否具有logoutParameterName參數指定的參數,默認參數名稱為logoutRequest
// 如果存在,則在sessionMappingStorage中刪除記錄,並注銷session。
handler.destroySession(request);
// 注銷session后,立刻停止執行后面的過濾器
return;
} else {
log.trace("Ignoring URI " + request.getRequestURI());
}
//條件都不滿足,繼續執行下面的過濾器
filterChain.doFilter(servletRequest, servletResponse);
}
如果直接CAS的logout話,會出現注銷成功頁面,其實大部分情況下這個頁面是沒有必要的,更多的需要可能是退出后顯示登錄頁面,並且登錄成功后還是會進入到之前的業務系統,那么可以修改cas-servlet.xml
在logoutController的bean配置中添加屬性"followServiceRedirects" 設置為true,然后在業務系統的注銷連接中加入"service 參數",值為業務系統的絕對URL。
如你的業務系統URL為http://a:8080/login 那么注銷URL就是 http://localhost:8080/cas/logout?service=http://a:8080/login
