基于CAS实现单点登录(SSO):cas client端的退出问题

标签: cas 单点登录 sso | 发表时间:2014-03-28 04:17 | 作者:tcl_6666
出处:http://blog.csdn.net

自从CAS 3.4就很好的支持了单点注销功能,配置也很简单。

之前版本因为在CAS服务器通过HttpClient发送消息时并未指定为POST方式,所以在CAS客户端的注销Filter中没有收到POST请求(要知道Filter只对Post请求起作用),也就没有做session销毁处理。

 

两个业务系统APP1和APP2

在没有配置单点退出时,效果是这样子的

1:登录APP1,然后经过CAS认证后进入APP1,再访问APP2无需要认证

2:在APP1中连接到cas的logout地址,现象注销成功界面,然后再访问APP1,还是可以进去的,因为APP1将用户的登录票据存入了session。

 

那么实现了单点退出后的效果应该是这样子的:

1:登录APP1,然后经过CAS认证后进入APP1,再访问APP2无需要认证

2:用户在APP1或者APP2点击注销,显示CAS的注销成功页面,然后再访问APP1或者APP2都需要再次认证。

 

具体配置为,在APP1和APP2的web.xml文件中增加:

<listener>  
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>  
</listener>  
      
 <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>  


注销的Filter要在其它Filter之前,界面的注销连接到CAS的logout地址,如 http://localhost:8080/cas/logout

 

SingleSignOutFilter,主要是在有ticket参数的时候,将session放到sessionMappingStorage,如果参数中存在logoutRequest,则注销session,那什么时候去注销sessionMappingStorage的东西呢?这是靠SingleSignOutHttpSessionListener来实现的,当有session被销毁的时候,触发将sessionMappingStorage中对应sessionid中的数据删除。

所以在配置单点登出的时候,一定要配置这个监听器,否则客户端很容易导致内存溢出的。让我们先来看看SingleSignOutFilter的整体逻辑。


那么这个是在什么时候会触发呢,这个是在你登陆的任意客户端,调用 https://localhost:8080/logout,这个取得cookie里面的TGT数据,找到TGT中关联的所有ST对应的地址(即多个cas client),向每个地址方式一个http请求,并传递logoutRequest参数。

来看看源代码是怎么实现的:

public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {  
      // 转换参数  
    final HttpServletRequest request = (HttpServletRequest) servletRequest;  
    //判断参数中是否具有artifactParameterName属性指定的参数名称,默认是ticket  
      if (handler.isTokenRequest(request)) {  
        // 如果存在,在本地sessionMappingStorage中记录session。  
          handler.recordSession(request);   
      } else if (handler.isLogoutRequest(request)) {//判断是否具有logoutParameterName参数指定的参数,默认参数名称为logoutRequest  
        // 如果存在,则在sessionMappingStorage中删除记录,并注销session。  
        handler.destroySession(request);  
          // 注销session后,立刻停止执行后面的过滤器  
          return;  
      } else {  
          log.trace("Ignoring URI " + request.getRequestURI());  
      }  
      //条件都不满足,继续执行下面的过滤器  
      filterChain.doFilter(servletRequest, servletResponse);  
  }  


如果直接访问CAS的logout话,会出现注销成功页面,其实大部分情况下这个页面是没有必要的,更多的需求可能是退出后显示登录页面,并且登录成功后还是会进入到之前的业务系统,那么可以修改cas-servlet.xml文件,在"logoutController"的bean配置中增加属性“followServiceRedirects”,设置为“true”,然后在业务系统的注销连接中加入"service参数",值为业务系统的绝对URL,这样就OK了,如你的业务系统URL为: http://localhost:8080/casClient,那么注销URL就为: http://localhost:8080/cas/logout?service=http://localhost:8080/casClient

 

如果出现这种现象:访问过 http://localhost:8080/cas/logout之后不关浏览器,还是能访问我的应用

可能因为:

1:你的CAS服务器将cookie设置成了浏览器有效,那么表示如果浏览器不关闭,则一直有效。

在WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml中设置cookie有效期,默认配置cookie有效期为-1

 

2:你的应用中注销的filter-mapping没有放在所有mapping之前

作者:tcl_6666 发表于2014-3-27 20:17:25 原文链接
阅读:51 评论:0 查看评论

相关 [cas 单点登录 sso] 推荐:

CAS解决单点登录SSO

- - CSDN博客推荐文章
关于CAS很多的原理和基础的配置启动,网上是很多的,我更多是结合我的实践和心得. 需要了解CAS的原理,认证协议,认证流程,可以参考以下文章. 让CAS支持客户端自定义登陆页面——客户端篇. CAS原理与配置-基于CAS的单点登陆的研究(上). 单点登录(SSO)是企业开发的重要问题,在我的毕设项目中,由于要和系统其他开发模块共用用户认证模块,方便共享用户资源,所以需要一个好的SSO解决方案.

CAS实现SSO单点登录原理

- - 非技术 - ITeye博客
CAS实现SSO单点登录原理. CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(属于 Web SSO ). CAS 开始于 2001 年, 并在 2004 年 12 月正式成为 JA-SIG 的一个项目.

CAS单点登录(SSO)完整教程

- - 互联网 - ITeye博客
CAS单点登录(SSO)完整教程(2012-02-01更新). 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤. 单点登录(SSO):请看百科解释. 本教程使用的SSO服务器是Yelu大学研发的CAS(Central Authentication Server),. CAS Server版本:cas-server-3.4.3.1、cas-server-3.4.10.

基于CAS实现单点登录(SSO):cas client端的退出问题

- - CSDN博客架构设计推荐文章
自从CAS 3.4就很好的支持了单点注销功能,配置也很简单. 之前版本因为在CAS服务器通过HttpClient发送消息时并未指定为POST方式,所以在CAS客户端的注销Filter中没有收到POST请求(要知道Filter只对Post请求起作用),也就没有做session销毁处理. 两个业务系统APP1和APP2.

SSO单点登录在互联网电商应用中的解决方案(基于CAS的改造)

- - CSDN博客互联网推荐文章
电商平台中无论是前端还是后端会存在大量的业务应用,在整个交易的过程中请求是在各个业务应用中流转的,对于用户来讲只需要登录一次就可以访问所有的业务,这就是单点登录SSO. 单点登录开源有很多的解决方案,比如基于session的SSO和基于cookie的SSO. 业界使用比较多的基于session的SSO的开源解决方案比如CAS,流程示意图如下:.

cas配置单点登录

- - 开源软件 - ITeye博客
        最近一段时间研究的cas,不知道是什么原因,可能自己最近太浮躁了,没有沉下心来去研究,所以一直拖着,将近拖了一周半的时间,上周的周总结,确保一定要解决的问题,今天还是横下心来,处理完这个问题,我是一个对于技术痴迷的人,对于现在研究出来这个结果非常高兴,与大家分享一下:.        注明:本文所讲的至少怎么配置,但是具体的原理和细节会在稍后的时间里更新给大家,如有不对的地方希望大家指出来,共同学习和探讨一下.

自己动手写SSO(单点登录)

- - ITeye博客
SSO在我们的应用中非常常见,例如我们在OA系统登录了,我们就可以直接进入采购系统,不需要再登录了,这样使我们非常方便. 现在网上也有很多实现方法,于是乎我也想写一个看看. 我主要用到的是cookie的机制. 在此,分享给大家, 同时提供源代码下载. SSO的实现一般是会有一个SSO Server,也会叫认证中心,同时也会有被认证的系统,如OA系统、采购系统等,他们就相当于SSO Server的client.

单点登录SSO的实现原理

- - 非技术 - ITeye博客
单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任. 单点登录在大型网站里使用得非常频繁,例如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯掉.

CAS 4.0 单点登录教程

- - ITeye博客
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一. SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 耶鲁大学(yale)开发的单点登录(Single Sign On)系统称为CAS(Central Authentication Service)被设计成一个独立的Web应用程序(cas.war).

漫谈单点登录(SSO) - EzrealLiu - 博客园

- -
SSO这一概念由来已久,网络上对应不同场景的成熟SSO解决方案比比皆是,从简单到复杂,各式各样应有尽有. 开源的有OpenSSO、CAS ,微软的AD SSO,及基于kerberos 的SSO等等……这些优秀的解决方案尽显开发及使用者的逼格,当然需求所致无谓好坏高低,满足实际之需才是王道. 本文并不讨论上述提到的方案的整合使用、或者复杂场景如:安全、防火墙、N 多个系统层叠调用这种"巨型项目"里SSO的实现与使用,也并不涉及 C/S 、C/S+B/S 的SSO解决方案,仅关注B/S 上的SSO实现.