zoukankan      html  css  js  c++  java
  • cas单点登出

    由于项目需求要实现单点登出需要在网上找了N久终于实现单点登出。

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

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

     

    项目结合CAS SpringSecurity SSH

     

    普通项目(没有结合Spring Security)的可以在web.xml中加入如下代码

     

    [xhtml] view plaincopy
     
    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中

    首先在web.xml中加入监听器。

     

    [xhtml] view plaincopy
     
    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过滤链中

     

     

    [xhtml] view plaincopy
     
    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/546785

    自己定义一个类

     

    [java] view plaincopy
     
    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 plaincopy
     
    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

  • 相关阅读:
    int (*p)[10] 与*p[10]的区别
    运算顺序
    关于linux开机进入grub问题的解决方法
    对于特殊字符串的处理方法
    学习进度条
    阅读《实例化需求》4-6章有感
    学习进度条
    阅读《实例化需求》1-3章有感
    问题账户需求分析
    2016年秋季个人阅读计划
  • 原文地址:https://www.cnblogs.com/challengeof/p/4281898.html
Copyright © 2011-2022 走看看