<转>实现CAS单点登出

普通项目(没有结合Spring Security)的可以在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 SpringSecurity SSH 可以将filter加入到spring Security过滤链中,也可以直接向上面的一样加入web.xml中

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

<!-- single sign out -->
<listener>
      <listener-class>
          org.jasig.cas.client.session.SingleSignOutHttpSessionListener
      </listener-class>
</listener>
<!-- single sign out -->

然后把filter加入到spring Security过滤链中

<!-- single sign out -->
<b:bean id="casSingleSignOutFilter" class="check.SingleSignOutFilter">
 <custom-filter before="CAS_PROCESSING_FILTER"/>
</b:bean>
<!-- single sign out -->

注意上面的class="check.SingleSignOutFilter"是自定义的filter(由于CAS3.1.3定义的SingleSignOutFilter在某种意思上没有起到作用)详情请见http://www.iteye.com/topic/546785

package check;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jasig.cas.client.session.HashMapBackedSessionMappingStorage;
import org.jasig.cas.client.session.SessionMappingStorage;
import org.jasig.cas.client.util.AbstractConfigurationFilter;
import org.jasig.cas.client.util.CommonUtils;
import org.jasig.cas.client.util.XmlUtils;

public final class SingleSignOutFilter extends AbstractConfigurationFilter
{
  private String artifactParameterName;
  private static SessionMappingStorage SESSION_MAPPING_STORAGE = new HashMapBackedSessionMappingStorage();
  private static Log log = LogFactory.getLog(SingleSignOutFilter.class);

  public SingleSignOutFilter()
  {
    this.artifactParameterName = "ticket";
  }

  public void init(FilterConfig filterConfig)
    throws ServletException
  {
    setArtifactParameterName(getPropertyFromInitParams(filterConfig, "artifactParameterName", "ticket"));
    init();
  }

  public void init() {
    CommonUtils.assertNotNull(this.artifactParameterName, "artifactParameterName cannot be null.");
    CommonUtils.assertNotNull(SESSION_MAPPING_STORAGE, "sessionMappingStorage cannote be null.");
  }

  public void setArtifactParameterName(String artifactParameterName) {
    this.artifactParameterName = artifactParameterName;
  }

  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    final HttpServletRequest request = (HttpServletRequest) servletRequest;  
    final String logoutRequest = CommonUtils.safeGetParameter(request, "logoutRequest");  
    Enumeration ff = request.getParameterNames();  
    String a = request.getQueryString();  
    if (CommonUtils.isNotBlank(logoutRequest)) {  
         final String sessionIdentifier = XmlUtils.getTextForElement(logoutRequest, "SessionIndex");  

         if (CommonUtils.isNotBlank(sessionIdentifier)) {  
            final HttpSession session = SESSION_MAPPING_STORAGE.removeSessionByMappingId(sessionIdentifier);  

            if (session != null) {  
                 String sessionID = session.getId();                     
                 try {  
                    session.invalidate();  
                 } catch (final IllegalStateException e) {  
                      
                 }  
            }  
         }  
     }  
      
    else{  
        final String artifact = CommonUtils.safeGetParameter(request, this.artifactParameterName);  
        final HttpSession session = request.getSession(false);  
          
        if (CommonUtils.isNotBlank(artifact) && session!=null) {  
            try {  
                SESSION_MAPPING_STORAGE.removeBySessionById(session.getId());  
            } catch (final Exception e) {  
                  
            }  
            SESSION_MAPPING_STORAGE.addSessionById(artifact, session);  
        }  
    }  

    filterChain.doFilter(servletRequest, servletResponse);  
  }

  public void setSessionMappingStorage(SessionMappingStorage storage) {
    SESSION_MAPPING_STORAGE = storage;
  }

  public static SessionMappingStorage getSessionMappingStorage() {
    return SESSION_MAPPING_STORAGE;
  }

  public void destroy()
  {
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CAS(Central Authentication Service)单点登出实现原理如下: 1. 用户在某个客户端应用程序点击登出按钮或者在其中一个应用程序进行登出操作。 2. 客户端应用程序将登出请求发送给CAS服务器。 3. CAS服务器接收到登出请求后,会将该请求广播给所有已经登录的客户端应用程序。 4. 已经登录的客户端应用程序接收到登出请求后,会销毁用户的会话信息,使用户在该应用程序中无法再访问受保护资源。 5. CAS服务器将登出请求的状态返回给发起登出请求的客户端应用程序。 6. 客户端应用程序根据返回的状态进行相应的操作,如重定向到登出成功页面或者显示登出成功的提示信息。 CAS单点登出通过在CAS服务器上集中管理用户的会话信息,实现了用户在一个应用程序中登出后,其他已经登录的应用程序也会被注销。这样可以确保用户在任何一个已登录的应用程序中进行登出操作后,都能够得到一致的登出状态。同时,CAS服务器还可以提供注销其他已登录应用程序的功能,以便用户在特定情况下快速注销所有已登录的应用程序。 需要注意的是,CAS单点登出实现需要客户端应用程序和CAS服务器之间进行通信,以便将登出请求传递给所有已登录的应用程序。因此,客户端应用程序需要正确配置CAS服务器的地址和认证密钥,以确保通信的安全性和有效性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值