CAS-登出配置

 

該圖java

當一個web 瀏覽器登陸到應用服務器時,應用服務器(application)會監測用戶的session,若是沒有session,則應用服務器會把url跳轉到CAS server上。要求web

用戶登陸,用戶登陸成功,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。cookie

<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 刪除。這樣就實現了單點登出功能。session

首先,要實現single sign out,在應用服務器application端的web.xml要加入如下配置app

<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以前url

配置部分的目的是在CAS server回調全部的application 進行單點登出操做的時候,須要這個Filter來實現session 清除。
 
singleSignOutFilter,主要是在有ticket參數的時候,將session放到sessionMappingStorage,若是參數中存在logoutRequest,則註銷session。
何時註銷sessionMappingStorage呢,這是靠SingleSignOutHttpSessionListener來實現的,當有session被註銷的時候,觸發將sessionMappingStorage中對應的sessionId中的數據刪除,因此在配置單點登出的時候,必定要配置這個監聽器,不然客戶端很容易致使內存溢出。
 
這個是什麼何時觸發的呢?
在登陸的客戶端,調用 cas/logout,這個取得cookie裏面的TGT數據,找到TGT中關聯的全部ST對應的地址,向每一個地址發送一個HTTP請求,並傳遞logoutRequest參數
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
相關文章
相關標籤/搜索