cas單點登出

因爲項目需求要實現單點登出須要在網上找了N久終於實現單點登出。php

使用cas-server-core-3.3.3.jar(CAS Server 3.3.3)html

使用cas-client-core-3.1.3.jar(CAS Client 3.1.3)java

 

項目結合CAS SpringSecurity SSHweb

 

普通項目(沒有結合Spring Security)的能夠在web.xml中加入以下代碼spring

 

[xhtml]  view plain copy
 
  1. <filter>  
  2.    <filter-name>CAS Single Sign Out Filter</filter-name>  
  3.    <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>  
  4. </filter>  
  5.   
  6. <filter-mapping>  
  7.    <filter-name>CAS Single Sign Out Filter</filter-name>  
  8.    <url-pattern>/*</url-pattern>  
  9. </filter-mapping>  
  10.   
  11. <listener>  
  12.     <listener-class>  
  13.        org.jasig.cas.client.session.SingleSignOutHttpSessionListener  
  14.     </listener-class>  
  15. </listener>  

 

 

 

在咱們的項目中因爲結合了SpringSecurity 能夠將filter加入到spring Security過濾鏈中,也能夠直接向上面的同樣加入web.xml中apache

首先在web.xml中加入監聽器。服務器

 

[xhtml]  view plain copy
 
  1. <!-- single sign out -->  
  2. <listener>  
  3.       <listener-class>  
  4.           org.jasig.cas.client.session.SingleSignOutHttpSessionListener  
  5.       </listener-class>  
  6. </listener>  
  7. <!-- single sign out -->  

 

 

而後把filter加入到spring Security過濾鏈中session

 

 

[xhtml]  view plain copy
 
  1. <!-- single sign out -->  
  2. <b:bean id="casSingleSignOutFilter" class="check.SingleSignOutFilter">  
  3.     <custom-filter before="CAS_PROCESSING_FILTER"/>  
  4. </b:bean>  
  5. <!-- single sign out -->  

 

 

注意上面的class="check.SingleSignOutFilter"是我自定義的filter(因爲CAS3.1.3定義的SingleSignOutFilter在某種意思上沒有起到做用)詳情請見http://www.javaeye.com/topic/546785app

本身定義一個類oop

 

[java]  view plain copy
 
  1. package check;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Enumeration;  
  5.   
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpSession;  
  13.   
  14. import org.apache.commons.logging.Log;  
  15. import org.apache.commons.logging.LogFactory;  
  16. import org.jasig.cas.client.session.HashMapBackedSessionMappingStorage;  
  17. import org.jasig.cas.client.session.SessionMappingStorage;  
  18. import org.jasig.cas.client.util.AbstractConfigurationFilter;  
  19. import org.jasig.cas.client.util.CommonUtils;  
  20. import org.jasig.cas.client.util.XmlUtils;  
  21.   
  22. public final class SingleSignOutFilter extends AbstractConfigurationFilter  
  23. {  
  24.   private String artifactParameterName;  
  25.   private static SessionMappingStorage SESSION_MAPPING_STORAGE = new HashMapBackedSessionMappingStorage();  
  26.   private static Log log = LogFactory.getLog(SingleSignOutFilter.class);  
  27.   
  28.   public SingleSignOutFilter()  
  29.   {  
  30.     this.artifactParameterName = "ticket";  
  31.   }  
  32.   
  33.   public void init(FilterConfig filterConfig)  
  34.     throws ServletException  
  35.   {  
  36.     setArtifactParameterName(getPropertyFromInitParams(filterConfig, "artifactParameterName""ticket"));  
  37.     init();  
  38.   }  
  39.   
  40.   public void init() {  
  41.     CommonUtils.assertNotNull(this.artifactParameterName, "artifactParameterName cannot be null.");  
  42.     CommonUtils.assertNotNull(SESSION_MAPPING_STORAGE, "sessionMappingStorage cannote be null.");  
  43.   }  
  44.   
  45.   public void setArtifactParameterName(String artifactParameterName) {  
  46.     this.artifactParameterName = artifactParameterName;  
  47.   }  
  48.   
  49.   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  
  50.     final HttpServletRequest request = (HttpServletRequest) servletRequest;     
  51.     final String logoutRequest = CommonUtils.safeGetParameter(request, "logoutRequest");     
  52.     Enumeration ff = request.getParameterNames();     
  53.     String a = request.getQueryString();     
  54.     if (CommonUtils.isNotBlank(logoutRequest)) {     
  55.          final String sessionIdentifier = XmlUtils.getTextForElement(logoutRequest, "SessionIndex");     
  56.   
  57.          if (CommonUtils.isNotBlank(sessionIdentifier)) {     
  58.             final HttpSession session = SESSION_MAPPING_STORAGE.removeSessionByMappingId(sessionIdentifier);     
  59.   
  60.             if (session != null) {     
  61.                  String sessionID = session.getId();                        
  62.                  try {     
  63.                     session.invalidate();     
  64.                  } catch (final IllegalStateException e) {     
  65.                          
  66.                  }     
  67.             }     
  68.          }     
  69.      }     
  70.          
  71.     else{     
  72.         final String artifact = CommonUtils.safeGetParameter(request, this.artifactParameterName);     
  73.         final HttpSession session = request.getSession(false);     
  74.              
  75.         if (CommonUtils.isNotBlank(artifact) && session!=null) {     
  76.             try {     
  77.                 SESSION_MAPPING_STORAGE.removeBySessionById(session.getId());     
  78.             } catch (final Exception e) {     
  79.                      
  80.             }     
  81.             SESSION_MAPPING_STORAGE.addSessionById(artifact, session);     
  82.         }     
  83.     }     
  84.   
  85.     filterChain.doFilter(servletRequest, servletResponse);     
  86.   }  
  87.   
  88.   public void setSessionMappingStorage(SessionMappingStorage storage) {  
  89.     SESSION_MAPPING_STORAGE = storage;  
  90.   }  
  91.   
  92.   public static SessionMappingStorage getSessionMappingStorage() {  
  93.     return SESSION_MAPPING_STORAGE;  
  94.   }  
  95.   
  96.   public void destroy()  
  97.   {  
  98.   }  
  99. }  

 

完成。

這樣便可實現單點登出。(全部java應用的單點退出)

1)這樣實現的效果是在登出的時候CAS Server 分發給各個客戶端讓各個客戶端都登出,這個得讓FIlter來獲取,例子:一個index頁面有兩個連接一個指向java應用,一個指向php應用在 java應用加filter 後能作出相應的動做退出動做,而對於php本身沒加任何filter就沒有退出。因此也得寫個filter。

 

 

2)因爲咱們點擊退出的時候請求CAS Server 然後Server分發任務讓每一個應用退出的消息,java程序經過filter來執行退出。PHP提供了一個phpCAS::handleLogoutRequests()來檢驗服務器發來的信息,

具體咱們能夠把這個代碼放在phpbb3/include/function.php中的點擊事件裏面代碼以下:

 

[php]  view plain copy
 
  1. if(!$admin && CAS_ENABLE){  
  2.     // initialize phpCAS   
  3.     phpCAS::client(CAS_VERSION_2_0, CAS_SERVER_HOSTNAME, CAS_SERVER_PORT, CAS_SERVER_APP_NAME);   
  4.     phpCAS::setNoCasServerValidation();   
  5.     // force CAS authentication   
  6.     phpCAS::handleLogoutRequests();//加的去看看有沒有服務器端發出註銷消息。  
  7.     phpCAS::forceAuthentication();   

 

原文出自:http://blog.csdn.net/lishuangzhe7047/article/details/38587151

相關文章
相關標籤/搜索