该图

当一个web 浏览器登录到应用服务器时,应用服务器(application)会监测用户的session,如果没有session,则应用服务器会把url跳转到CAS server上。要求

用户登录,用户登录成功,CAS server会记住请求的application的url和该用户的sessionId(在应用服务器跳转到Url时,通过出参数传给CAS server).此时在CAS服务器会种下TGC Cookie值到web browser ,拥有该TGC Cookie的web browser 可以无需登录进入所有建立sso服务的应用服务器application

第二张图中,当一个web浏览器要求退出应用服务器,应用服务器application会把url跳转到CAS server上的/cas/logout url资源上。

CAS server接受到请求后,会检测用户的TGC cookie,把对应的session清除,同时会找到所有通过该TGC sso登录的应用服务器URL提交请求,所有的回调请求中包含一个参数 logoutRequest。

<samlp:LogoutRequest ID="[RANDOM ID]" Version="2.0" IssueInstant="[CURRENT DATE/TIME]">
<saml:NameID>@NOT_USED@</saml:NameID>
<samlp:SessionIndex>[SESSION IDENTIFIER]</samlp:SessionIndex>
</samlp:LogoutRequest>

  所有收到请求的应用服务器application会解析这个参数,获取sessionId,根据这个ID获取session后,把session 删除。这样就实现了单点登出功能。

首先,要实现single sign out,在应用服务器application端的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 client Filter,则CAS Signle Sign out Filter 必须放在CAS client Filter之前

配置部分的目的是在CAS server回调所有的application 进行单点登出操作的时候,需要这个Filter来实现session 清除。
 
singleSignOutFilter,主要是在有ticket参数的时候,将session放到sessionMappingStorage,如果参数中存在logoutRequest,则注销session。
什么时候注销sessionMappingStorage呢,这是靠SingleSignOutHttpSessionListener来实现的,当有session被注销的时候,触发将sessionMappingStorage中对应的sessionId中的数据删除,所以在配置单点登出的时候,一定要配置这个监听器,否则客户端很容易导致内存溢出。
 
这个是什么什么时候触发的呢?
在登录的客户端,调用 cas/logout,这个取得cookie里面的TGT数据,找到TGT中关联的所有ST对应的地址,向每个地址发送一个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。
如你的业务系统URL为http://a:8080/login 那么注销URL就是 http://localhost:8080/cas/logout?service=http://a:8080/login
 
 
 
 
 

CAS-登出配置的更多相关文章

  1. cas系列-cas登出(四)

    跟登陆一样,登出操作也很重要.由于是多应用间操作,状态保持也是一个要点,根据登出的影响范围,可以将登出操作分为两类: 单应用登出 单点登出(多应用登出) 顾名思义,单应用登出即登出只影响被操作的应用会 ...

  2. CAS学习笔记四:CAS单点登出流程

    CAS 的登出包含两种情况,一种是CAS客户端登出,另一种是CAS单点登出,使用流程图说明这两者的不同.(一图胜千言) 总结自官方文档 CAS客户端登出流程 如图,客户端的登出仅仅是过期当前用户与客户 ...

  3. CAS学习笔记五:SpringBoot自动/手动配置方式集成CAS单点登出

    本文目标 基于SpringBoot + Maven 分别使用自动配置与手动配置过滤器方式实现CAS客户端登出及单点登出. 本文基于<CAS学习笔记三:SpringBoot自动/手动配置方式集成C ...

  4. 源代码解读Cas实现单点登出(single sign out)功能实现原理

    关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...

  5. cas sso单点登录系列6_cas单点登录防止登出退出后刷新后退ticket失效报500错

    转(http://blog.csdn.net/ae6623/article/details/9494601) 问题: 我登录了client2,又登录了client3,现在我把client2退出了,在c ...

  6. 源代码解读Cas实现单点登出(single sign out)功能实现原理--转

    关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...

  7. 单点登录CAS使用记(六):单点登出、单点注销

    单点登出基本上没有啥配置 直接在原来logout的时候,重定向到Cas-Server的logout方法 @RequestSecurity @RequestMapping(value = "l ...

  8. [置顶] SSO单点登录系列6:cas单点登录防止登出退出后刷新后退ticket失效报500错

    这个问题之前就发现过,最近有几个哥们一直在问我这个怎么搞,我手上在做另一个项目,cas就暂时搁浅了几周.现在我们来一起改一下你的应用(client2/3)的web.xml来解决这个2b问题,首先看下错 ...

  9. SSO单点登录一:cas单点登录防止登出退出后刷新后退ticket失效报500错,也有退出后直接重新登录报票根验证错误

    问题1: 我登录了client2,又登录了client3,现在我把client2退出了,在client3里面我F5刷新了一下,结果页面报错: 未能够识别出目标 'ST-41-2VcnVMguCDWJX ...

  10. CAS单点登出的原理

    单点登出功能跟单点登录功能是相对应的,旨在通过Cas Server的登出使所有的Cas Client都登出. Cas Server的登出是通过请求“/logout”发生的,即如果你的Cas Serve ...

随机推荐

  1. 20145310《网络对抗》Exp9 Web安全基础实践

    基础问题回答 SQL注入攻击原理,如何防御? SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,通过执行SQL语句进执行攻击者所要的操作. 如何防御?首先严格区分 ...

  2. Python3基础 str 通过拆分字符串与插入新的内容形成新的字符串

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  3. Wireshark过滤总结

    Wireshark提供了两种过滤器:捕获过滤器:在抓包之前就设定好过滤条件,然后只抓取符合条件的数据包.显示过滤器:在已捕获的数据包集合中设置过滤条件,隐藏不想显示的数据包,只显示符合条件的数据包.需 ...

  4. LightOJ 1199 Partitioning Game(sg函数)题解

    题意:可以把一堆石子分成不相等的两堆,不能操作为败 思路:把一个石子拆成两个,变成了两个独立的游戏,mex里加上两者的sg异或.sg打表. 代码: #include<set> #inclu ...

  5. [bzoj 1260][CQOI 2007]涂色paint

    Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符串表示这个目标:RGBGR. 每次你可以把一段连续 ...

  6. 【Coursera】Security Introduction -Ninth Week(1)

    前言 Coursera 的 Internet History,Technology,and Security 进入最后一周的学习了,在这最后一周内,需要进行的内容是 public-key 公钥系统的讲 ...

  7. ros 查找包路径

    rospack find 包名

  8. Jenkins 构建 coding项目,插件

    安装插件:http://updates.jenkins-ci.org/download/plugins/coding-webhook/

  9. Linux 常用的压缩命令有 gzip 和 zip

    Linux 常用的压缩命令有 gzip 和 zip,两种压缩包的结尾不同:zip 压缩的后文件是 *.zip ,而 gzip 压缩后的文件 *.gz 相应的解压缩命令则是 gunzip 和 unzip ...

  10. Nginx 多重条件判断

    server{ listen 80; server_name xxx.com; index index.html index.htm index.php admin.php; root /home/w ...