文档章节

CAS研究(四)-登出/logout

abcijkxyz
 abcijkxyz
发布于 2016/07/08 16:29
字数 704
阅读 2
收藏 0
点赞 0
评论 0


很多童鞋对单点登出不是很理解,下面我们来看看单点登出到底做了什么东西,

我们来看看怎么从配置到代码的。

1)web.xml

com.bingo.tfp.web.init.SafeDispatcherServlet

<servlet-mapping>
<servlet-name>cas</servlet-name>
<url-pattern>/logout</url-pattern>
</servlet-mapping>

从上面可以知道,所有/logout的请求都交给SafeDispatcherServlet去分发了,查看代码可以知道这个Servlet只是对 org.springframework.web.servlet.DispatcherServlet一次包装,将所有请求都交给 org.springframework.web.servlet.DispatcherServlet去处理了。

2)cas-servlet.xml

handlerMappingC的bean里面有一段配置:

<prop key="/logout">
logoutController
</prop>

也就是说,所有/logout的请求,都交给一个beanid为logoutController的Bean去处理了,那么我们看看com.bingo.tfp.web.LogoutController到底做了什么事情,

<bean id="logoutController" class="com.bingo.tfp.web.LogoutController"
p:centralAuthenticationService-ref="centralAuthenticationService"
p:logoutView="casLogoutView"
p:warnCookieGenerator-ref="warnCookieGenerator"
p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator" 
p:followServiceRedirects="true"/>
我们看看源码是怎么操作的:


protected ModelAndView handleRequestInternal(
        final HttpServletRequest request, final HttpServletResponse response)
        throws Exception {
    	//取得TGT_ID
        final String ticketGrantingTicketId = this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request);
        // 取得service参数数据,这个参数是可选参数
        final String service = request.getParameter("service");
        
        //如果TGT不为空
        if (ticketGrantingTicketId != null) {
        	//那么在centralAuthenticationService中销毁
            this.centralAuthenticationService
                .destroyTicketGrantingTicket(ticketGrantingTicketId);
            //ticketGrantingTicketCookieGenerator 中销毁cookie
            this.ticketGrantingTicketCookieGenerator.removeCookie(response);
            //warnCookieGenerator 中销毁
            this.warnCookieGenerator.removeCookie(response);
        }
        // 如果参数:followServiceRedirects为true 同时service不会空的时候,跳转到service指定的URL
        if (this.followServiceRedirects && service != null) {
            return new ModelAndView(new RedirectView(service));
        }
        //否则,跳转到logoutView指定的页面
        return new ModelAndView(this.logoutView);
    }

是不是很简单,那么有童鞋要问了,那么时候访问客户端呢?不要着急,我们在来看看

this.centralAuthenticationService
                .destroyTicketGrantingTicket(ticketGrantingTicketId);

做了什么事情:

public void destroyTicketGrantingTicket(final String ticketGrantingTicketId) {
        //断言参数不能空
    	Assert.notNull(ticketGrantingTicketId);
    	
        if (log.isDebugEnabled()) {
            log.debug("Removing ticket [" + ticketGrantingTicketId + "] from registry.");
        }
        // 从票据仓库中取得TGT票据
        final TicketGrantingTicket ticket = (TicketGrantingTicket) this.ticketRegistry.getTicket(ticketGrantingTicketId, TicketGrantingTicket.class);
        //如果票据为空,则直接返回
        if (ticket == null) {
            return;
        }

        if (log.isDebugEnabled()) {
            log.debug("Ticket found.  Expiring and then deleting.");
        }
        //叫票据注销,也就是设置为期满(或者叫做过期)
        ticket.expire();
        //在票据仓库中删除该票据
        this.ticketRegistry.deleteTicket(ticketGrantingTicketId);
    }
很奇怪是不是,居然还没有请求客户端的东西,别急嘛。我们再来看看
ticket.expire();
做了什么,这个是TicketGrantingTicketImpl来实现的。

 public synchronized void expire() {
        this.expired = true;
        logOutOfServices();
    }
是不是发现新大陆了?

下面是logOutOfServices()方法的源代码:

private void logOutOfServices() {
        for (final Entry<String, Service> entry : this.services.entrySet()) {

            if (!entry.getValue().logOutOfService(entry.getKey())) {
                LOG.warn("Logout message not sent to [" + entry.getValue().getId() + "]; Continuing processing...");   
            }
        }
    }
哇,原来在TGT票据里面有个Entry来保存用户访问过的service对象,key是对应service的seesionID,那么是不是使用https请求客户无端呢?看看AbstractWebApplicationService类就知道咯,

public synchronized boolean logOutOfService(final String sessionIdentifier) {
        if (this.loggedOutAlready) {
            return true;
        }

        LOG.debug("Sending logout request for: " + getId());

        final String logoutRequest = "<samlp:LogoutRequest xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\" ID=\""
            + GENERATOR.getNewTicketId("LR")
            + "\" Version=\"2.0\" IssueInstant=\"" + SamlUtils.getCurrentDateAndTime()
            + "\"><saml:NameID xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">@NOT_USED@</saml:NameID><samlp:SessionIndex>"
            + sessionIdentifier + "</samlp:SessionIndex></samlp:LogoutRequest>";
        
        this.loggedOutAlready = true;
        
        if (this.httpClient != null) {
            return this.httpClient.sendMessageToEndPoint(getOriginalUrl(), logoutRequest, true);
        }
        
        return false;
    }
怎么样,这样是不是对单点登出细节比较清楚呢。



本文转载自:http://blog.csdn.net/yuwenruli/article/details/6620947

共有 人打赏支持
abcijkxyz
粉丝 60
博文 6196
码字总数 1876
作品 0
深圳
项目经理
CAS单点登出实现案例

单点登出的实现比较简单,就是简单的几个配置。 如果直接调用cas的logout的url进行登出,则会暴露cas的登出界面 显然这不是我们想要的,通常登出的需求是:退出当前账户,然后将url重定向到登...

Pig-man
2016/12/10
126
0
CAS注销后自定义跳转路径

CAS单点退出后,会直接链接到服务器的logout页面,要使系统退出后能返回原来的项目,需要做一些修改。 第一步、服务端cas-servlet.xml配置 <bean id="logoutController" class="org.jasig.c...

很好亦平凡ms
2016/07/08
57
0
cas单点登出 回调客户端,源码在哪里?没找到

cas-server-3.5.2.1 cas-client-3.3.3 单点登出 访问cas服务端logout登出,服务端回调所有客户端app销毁session的源代码在哪里?没找到啊 我有源码包,就是不知道是哪个类?...

jack_jones
2014/12/04
282
0
不切割DNA的CRISPR终于诞生!有望攻克肾病、糖尿病等常见病

  近年来,随着科学家们对基因编辑技术的不断探索,锌指核酸内切酶(ZFN)、TALEN 技术相继被发现并应用。而CRISPR-Cas系统一经发现,就因其简便的操作、精准的 DNA 靶向及剪切功能,被生物...

DeepTech深科技
2017/12/14
0
0
cas单点登出时跳转问题

碰到了这样的问题,登录后页面有“当前登录用户lxf”,当退出时,即登出让页面跳到index.jsp去,但是点击“登出”好像并没有完全退出,因为页面是跳转到了index.jsp,但是仍显示“当前登录用户...

lxf725
2014/06/23
721
3
【转】Yale_CAS客户端配置说明

Java Web应用 使用cas-client-3.1.12 Java 设置filter <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置--> <listener> <listener-class>org.jasig.cas.client.session.SingleSig......

leiboo
2014/04/21
0
0
IE将作古?微软将揭开Gazelle浏览器面纱

据国外媒体报道,微软在计划下个月举行的USENIX安全专题讨论会(USENIX Security Symposium)上透露Gazelle(瞪羚)浏览器细节。 据悉,微软研究院网站已经在本周登出了这则消息。USENIX则是...

老枪
2009/07/04
655
1
基于CAS实现单点登录(SSO):cas client端的退出问题

从CAS 3.4就很好的支持了单点注销功能,配置也很简单。 之前版本因为在CAS服务器通过HttpClient发送消息时并未指定为POST方式,所以在CAS客户端的注销Filter中没有收到POST请求(要知道Filte...

kongjun
2016/02/18
692
1
CAS实现单点登录

CAS介绍 开源的企业级单点登录解决方案 CAS Server 是需要独立部署的 Web 应用 CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache,...

小咔蹭
2013/12/05
2.8K
25
2014-04-20 二手交易平台接口文档

平台接口文档v.0.2 经过一段时间的开发和研究,二手交易平台的模块已经有初步架构的形成,原有不合理的内容进行了修改和调整 架构的说明如下: 架构: Onethink为应用层框架,ThinkPHP为底层...

syaokun219
2014/04/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Android 获取各大音乐平台的真实下载地址

废话 电脑使用谷歌浏览器或者QQ浏览器的时候。。。。。。。说不清楚,还是看图吧 大概意思就是,只要网页上需要播放,只要能播放并且开始播放,这个过程就肯定会请求到相关的音乐资源,然后就...

她叫我小渝
29分钟前
0
0
shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
今天
2
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
2
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
1
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
今天
1
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
今天
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部