`

<转>实现CAS单点登出

    博客分类:
  • 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()
  {
  }
}

分享到:
评论

相关推荐

    cas单点登出的3个类

    标题中的“cas单点登出的3个类”指的是在CAS(Central Authentication Service)系统中实现单点登出功能所涉及的关键组件。CAS是一个开源的身份验证框架,它提供了单点登录(Single Sign-On, SSO)功能,允许用户...

    cas单点才登出原理

    接下来,我们将详细探讨CAS单点登出的原理。 首先,理解SSO的基本流程: 1. 用户打开一个受CAS保护的应用系统A。 2. 应用系统A发现用户未登录,重定向到CAS服务器。 3. 用户在CAS服务器上输入凭证并验证通过。 4. ...

    cas实现单点登录,登出(java和php客户端)

    - **登出**:单点登出(Single Logout, SLO)需要确保用户在一处登出时,其他所有已登录的资源也同时失效。CAS支持SLO,客户端需要正确处理登出请求和清除本地会话。 - **测试**:对SSO系统进行全面的功能和安全测试...

    cas .net单点登录

    CAS(Central Authentication Service)是基于Java开发的一种开源的单点登录(Single Sign-On,简称SSO)协议。在.NET环境中,我们可以通过实现CAS...通过以上步骤,开发者可以快速地在.NET应用中实现CAS单点登录功能。

    用cas实现mantis单点登录和登出

    ### 使用 CAS 实现 Mantis 单点登录与登出 #### 概述 单点登录(Single Sign-On,简称 SSO)是一种常见的身份认证模式,它允许用户在多个应用程序和服务中仅通过一次登录就能访问所有相关系统而无需多次输入密码。...

    cas实现单点登录

    通过对CAS单点登出流程和技术细节的深入了解,我们可以更好地理解其工作原理,进一步优化和增强系统的安全性与用户体验。通过合理配置CAS及其相关组件,可以实现高效稳定的单点登录和单点登出功能,为用户提供无缝...

    CAS客户端JAR包版本3.3.3

    -- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 --&gt; &lt;listener&gt; &lt;listener-class&gt; org.jasig.cas.client.session.SingleSignOutHttpSessionListener &lt;/listener-class&gt; &lt;/listener&gt; &lt;!-- 该...

    cas单点登录登出学习

    单点登出(Single Sign-Out,SSO)功能则涉及到清理所有已登录应用的会话,确保用户在一处登出时,所有关联的系统也会同步登出。Cas 提供了两种登出模式:前端通道(Front Channel)和后端通道(Back Channel)。...

    cas单点登录登出配置demo

    cas单点登录登出配置 php 和java 版本。 完美实现了登录和登出, demo cas server 3.5.2 版本 -- 扔到tomcat下直接跑。 java客户端为 3.2.1. -- 要想跑的话需要自己下载jar php 扔到php工程里面直接跑。。 记得看...

    struts2+cas单点登陆例子

    Struts2和CAS单点登录(SSO)的集成是一个常见的Web应用安全实践,它允许用户在一个系统登录后,无须再次输入凭证就能访问其他相互信任的系统。在这个例子中,我们将深入探讨如何在MyEclipse环境下使用Struts2框架与...

    基于Cas的单点登录实现

    **基于Cas的单点登录实现** 单点登录(Single Sign-On,简称SSO)是一种在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的技术。它为用户提供了一种方便、高效的访问多系统的方式,同时减少...

    CAS单点登录demo

    6. CAS单点登出: - 当用户在任一应用系统中登出时,CAS Server会清除所有已签发的Ticket,确保用户在所有系统中都被登出。 通过这个“CAS单点登录demo”,你可以学习并实践如何设置和配置CAS环境,理解其工作流程...

    CAS单点登录实例

    8. **单点登出(Single Sign-Out,SSO)**:除了单点登录,CAS还提供了单点登出功能,允许用户在一处登出后,自动从所有已登录的应用中注销。 9. **自定义扩展**:CAS设计为高度可扩展,允许开发人员根据需求定制...

    CAS 单点登录配置说明

    总结,CAS单点登录配置涉及SSL安全设置、CAS服务器的部署、客户端应用的集成以及证书的管理等多个环节。理解并掌握这些知识点,对于构建安全、便捷的多应用系统环境至关重要。希望本文提供的信息对您在配置CAS单点...

    CAS单点登录多语言整合文档+源码

    这个压缩包文件包含的是关于CAS单点登录的多语言整合文档和源码,特别提到了PHP客户端和Java客户端的整合。 首先,我们来深入理解一下CAS的基本工作原理。当用户尝试访问受CAS保护的应用时,会被重定向到CAS服务器...

    CAS的ASP.NET客户端配置及验证

    7. **处理SSO登出**:为了实现单点登出,需要在用户登出本地应用时,向CAS服务器发送登出请求,从而清除所有已验证的会话。 8. **异常处理**:配置异常处理机制,处理可能出现的CAS通信错误或验证失败情况。 9. **...

    CAS 单点登录安装笔记4 -- asp.net client端的设置

    实现单点登出功能,当用户在ASP.NET应用中登出时,也需要通知CAS服务器登出。这通常通过发送一个登出请求到CAS服务器的登出URL来实现。 ```csharp protected void btnLogout_Click(object sender, EventArgs e) { ...

Global site tag (gtag.js) - Google Analytics