CAS-登出配置


 

該圖

當一個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之前

配置部分的目的是在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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM