`
xly_971223
  • 浏览: 1285388 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CAS之SingleSignOutFilter

 
阅读更多
这里只给出核心代码 doFilter
首先要明确一点 SingleSignOutFilter 会拦截所有请求,而不是仅仅拦截logout时的请求

在sso client应用中存在一个Map<Ticket,HttpSession>对象
在sso server认证用户名密码成功后,会redirect一个带有ticket的请求到sso client
这时就执行下面的逻辑,ticket和当前session会被缓存到Map

退出时,sso server发送带logoutRequest参数的http请求到每一个sso client
这时就会执行下面的逻辑 --- 删除ticket对应的session 然后销毁session

    public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {
        final HttpServletRequest request = (HttpServletRequest) servletRequest;
        
        //add for webdav sso
		String reqURI = ((HttpServletRequest)request).getRequestURI();
		boolean isCesso = false;
		if(reqURI.endsWith("/webdav") || reqURI.contains("/webdav/")){
	        if(request.getHeader(WEBDAV_CESSO_FLAG)!=null 
	        		&& !request.getHeader(WEBDAV_CESSO_FLAG).equals(""))
	        	isCesso = Boolean.valueOf(request.getHeader(WEBDAV_CESSO_FLAG).toString());
	        if(!isCesso){
	        	filterChain.doFilter(servletRequest, servletResponse);
	        	return; 
	        }
		}

		//退出时,cas server向cas client发送post请求,其中包括了sessionId,此filter获取session并销毁之
        if ("POST".equals(request.getMethod())) {
            final String logoutRequest = request.getParameter("logoutRequest");
            
            if (logoutRequest!=null && !"".equals(logoutRequest)) {
            	    		
                final String sessionIdentifier = XmlUtils.getTextForElement(logoutRequest, "SessionIndex");

                if (!"".equals(sessionIdentifier)&& sessionIdentifier!=null) {
                	log.info(" client---Remove A Session Indentify : "+sessionIdentifier);
                	final HttpSession session = SESSIONSTORAGE.removeByMappingId(sessionIdentifier);
                	
                	//首先注销本地session
                    request.getSession().invalidate();
                    log.info("client---invalidate request's Session");
                    
                	if (session != null) {
                		session.invalidate();
                	}
                    return;
                }
              
            }
        } else {
//非logout请求,判断是否包含ticket参数,如果包含缓存ticket session到map
            String artifact = request.getParameter(this.artifactParameterName);
            final HttpSession session = request.getSession();
            if(null == artifact && null != session.getAttribute("ticket")){
            	artifact = (String)session.getAttribute("ticket");
            }
            if (!"".equals(artifact)&&!"null".equals(artifact) && artifact!=null 
            		&& SESSIONSTORAGE.getSessionByMappingID(artifact)==null) {
            	log.info(" client---Add A New Session Indentify : "+artifact);
            	SESSIONSTORAGE.addSessionByMappingId(artifact, session); 
            }
        }

        filterChain.doFilter(servletRequest, servletResponse);
    }
分享到:
评论

相关推荐

    cas单点登出的3个类

    2. **NewSingleSignOutFilter.java**:这是一个过滤器类,可能是对CAS官方提供的`SingleSignOutFilter`的优化或扩展。在Spring Security或者 CAS服务器的配置中,这类过滤器通常会被用来监听和处理HTTP的logout请求...

    cas 配置client 1.0 &2.0 及proxy DEMO 说明

    org.jasig.cas.client.session.SingleSignOutFilter &lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;CAS Single Sign Out Filter&lt;/filter-name&gt; &lt;url-pattern&gt;/* &lt;/filter-mapping&gt; &lt;filter...

    CAS客户端JAR包版本3.3.3

    &lt;filter-class&gt;org.jasig.cas.client.session.SingleSignOutFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;CAS Single Sign Out Filter&lt;/filter-name&gt; &lt;url-pattern&gt;/* &lt;/filter-mapping&gt; ...

    Shiro和cas部分整合

    通过`DelegatingFilterProxy`,它指向了名为 `singleSignOutFilter` 的bean。当用户在任何已集成CAS的应用中登出时,这个过滤器会广播登出事件,使得其他应用也同步登出状态。 整合完成后,用户在访问应用时,首先...

    关于cas安装和配置

    - **配置客户端退出过滤器**:`&lt;filter-class&gt;org.jasig.cas.client.session.SingleSignOutFilter&lt;/filter-class&gt;` 处理 CAS 发送的登出通知。 - **配置客户端应用访问地址**:`&lt;param-value&gt;...

    cas实现单点登录

    3. **关键代码分析**:`SingleSignOutFilter`类是实现单点登出的关键组件之一。下面简要分析其核心代码: ```java public void doFilter(final ServletRequest servletRequest, final ServletResponse servlet...

    CAS多数据库配置单点登录

    * 单点登出过滤器:org.jasig.cas.client.session.SingleSignOutFilter * 认证过滤器:org.jasig.cas.client.authentication.AuthenticationFilter * Ticket校验过滤器:org.jasig.cas.client.validation.Cas20...

    cas-client3.2.1

    CAS(Central Authentication Service)是一种广泛使用的开放源代码的单点登录(Single Sign-On,简称SSO)协议,它允许用户通过一个认证过程访问多个应用系统,而无需在每个系统上分别进行登录。在这个场景中,"cas...

    cas客户端java版

    7. **单点登出**:CAS还支持单点登出(Single Sign-Out,SSO),即用户在一个应用中登出后,所有其他已通过CAS认证的应用也会同步登出。你可以在客户端配置中开启这一功能。 8. **测试与调试**:完成以上步骤后,你...

    spring boot 1.5.4 集成shiro+cas,实现单点登录和权限控制.docx

    - 配置`SingleSignOutFilter`以支持CAS的单点登出功能,当用户在一个应用中登出时,其他所有已登录的应用也会同步登出。 - `SingleSignOutHttpSessionListener`是一个监听器,用于监听Session事件,配合`Single...

    CAS示例环境部署及配置(完整版)[归纳].pdf

    特别是`SingleSignOutFilter`,需确保其映射在所有其他过滤器之前。 完成以上步骤后,你就成功地搭建了一个基于CAS的SSO测试环境。用户只需在首次登录时提供凭证,之后访问其他受CAS保护的应用时,无需再次登录,...

    CAS60认证服务器-接口使用手册-V30.docx

    &lt;filter-class&gt;org.jasig.cas.client.session.SingleSignOutFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;casFilter&lt;/filter-name&gt; &lt;url-pattern&gt;/* &lt;/filter-mapping&gt; ``` **2.2.2.2 拷贝...

    统一身份认证对外文档

    org.jasig.cas.client.session.SingleSignOutFilter &lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;CASSingleSignOutFilter&lt;/filter-name&gt; &lt;url-pattern&gt;/* &lt;/filter-mapping&gt; &lt;filter&gt; &lt;filter-...

    气象政务管理平台单点登录、统一用户、统一菜单服务、消息服务集成、新建快捷菜单管理服务.docx

    这包括设置监听器(Listener)、单点注销过滤器(Single Sign Out Filter)、认证过滤器(Authentication Filter)以及票证验证过滤器(Cas30ProxyReceivingTicketValidationFilter)。其中,初始化参数如...

    Spring Security整合CAS的示例代码

    5. 当用户在CAS服务器上登出时,`SingleSignOutFilter`监听并同步客户端应用程序的会话,实现SSO登出。 **注意事项** - `client.url`和`cas.server.url`是需要替换的实际客户端和CAS服务器的URL。 - 数据库配置...

    跨域SSO实例安装和配置指南

    &lt;filter-class&gt;org.jasig.cas.client.session.SingleSignOutFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;CASFilter&lt;/filter-name&gt; &lt;url-pattern&gt;/* &lt;/filter-mapping&gt; ``` 此外还需要配置...

    气象政务管理平台单点登录、统一用户、统一菜单服务、消息服务集成、新建快捷菜单管理..docx

    例如,在JAVA程序中,需要在 `web.xml` 配置文件中添加相应的 Filter,如 `SingleSignOutFilter`、`AuthenticationFilter` 和 `Cas30ProxyReceivingTicketValidationFilter`,这些 Filter 负责处理CAS的登录、登出和...

Global site tag (gtag.js) - Google Analytics