cas单点登出
由于项目需求要实现单点登出需要在网上找了N久终于实现单点登出。
使用cas-server-core-3.3.3.jar(CAS Server 3.3.3)
使用cas-client-core-3.1.3.jar(CAS Client 3.1.3)
项目结合CAS SpringSecurity SSH
普通项目(没有结合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>
在我们的项目中由于结合了SpringSecurity 可以将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.javaeye.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()
- {
- }
- }
完成。
这样即可实现单点登出。(所有java应用的单点退出)
1)这样实现的效果是在登出的时候CAS Server 分发给各个客户端让各个客户端都登出,这个得让FIlter来获取,例子:一个index页面有两个链接一个指向java应用,一个指向php应用在 java应用加filter 后能做出相应的动作退出动作,而对于php自己没加任何filter就没有退出。所以也得写个filter。
2)由于我们点击退出的时候请求CAS Server 而后Server分发任务让每个应用退出的消息,java程序通过filter来执行退出。PHP提供了一个phpCAS::handleLogoutRequests()来检验服务器发来的信息,
具体我们可以把这个代码放在phpbb3/include/function.php中的点击事件里面代码如下:
- if(!$admin && CAS_ENABLE){
- // initialize phpCAS
- phpCAS::client(CAS_VERSION_2_0, CAS_SERVER_HOSTNAME, CAS_SERVER_PORT, CAS_SERVER_APP_NAME);
- phpCAS::setNoCasServerValidation();
- // force CAS authentication
- phpCAS::handleLogoutRequests();//加的去看看有没有服务器端发出注销消息。
- phpCAS::forceAuthentication();
原文出自:http://blog.csdn.net/lishuangzhe7047/article/details/38587151
cas单点登出的更多相关文章
- CAS学习笔记四:CAS单点登出流程
CAS 的登出包含两种情况,一种是CAS客户端登出,另一种是CAS单点登出,使用流程图说明这两者的不同.(一图胜千言) 总结自官方文档 CAS客户端登出流程 如图,客户端的登出仅仅是过期当前用户与客户 ...
- CAS学习笔记五:SpringBoot自动/手动配置方式集成CAS单点登出
本文目标 基于SpringBoot + Maven 分别使用自动配置与手动配置过滤器方式实现CAS客户端登出及单点登出. 本文基于<CAS学习笔记三:SpringBoot自动/手动配置方式集成C ...
- CAS单点登出的原理
单点登出功能跟单点登录功能是相对应的,旨在通过Cas Server的登出使所有的Cas Client都登出. Cas Server的登出是通过请求“/logout”发生的,即如果你的Cas Serve ...
- 源代码解读Cas实现单点登出(single sign out)功能实现原理
关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...
- 源代码解读Cas实现单点登出(single sign out)功能实现原理--转
关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...
- 单点登录CAS使用记(六):单点登出、单点注销
单点登出基本上没有啥配置 直接在原来logout的时候,重定向到Cas-Server的logout方法 @RequestSecurity @RequestMapping(value = "l ...
- Cas(08)——单点登出
单点登出 目录 1.1 Cas Client端配置单点登出 1.2 Cas Server端禁用单点登出 1.1 Cas Client端配置单点登出 单点登出功能跟单点登录功能是 ...
- springmvc shiro整合cas单点登入
shiro cas分为登入跟登出 maven依赖: <dependency> <groupId>org.apache.shiro</groupId> <art ...
- jfinal集成cas单点认证实践
本示例jfinal集成cas单点认证,采用获取到登录用户session信息后,在本地站点备份一份session信息,主要做以下几个步骤: 1.站点引入响应jar包: 2.在web.xml中配置对应过滤 ...
随机推荐
- [转]TCP、UDP数据包大小的确定
TCP.UDP数据包大小的确定 http://blog.163.com/jianlizhao%40126/blog/static/1732511632013410101827640/ U ...
- Linq to XML 之XElement的Descendants方法的新发现
C#操作XML的方法有很多,但个人认为最方便的莫过于Linq to XML了,特别是XElement的Descendants方法是我最常用的一个方法. 这个方法可以根据节点名(Name)找到当前调用的 ...
- NET免费服务器
NET免费服务器 1.先注册一个号.地址:https://appharbor.com/ 2.看看有没有你需要的插件,基本上都是免费的 3.本地创建git库 4.复制git远程仓库的地址 5.推送到远程 ...
- python学习小结8:I/O
文件I/O是Python中最重要的技术之一,在Python中对文件进行I/O操作是非常简单的. 打印到屏幕上 >>> print "python is really a g ...
- android 开发自建wifi热点的默认ip
android 开发自建wifi热点的默认ip是:192.168.43.1 (小米3测试)
- 2879: [Noi2012]美食节 - BZOJ
Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...
- hadoop 蓄水池抽样 分布式抽样
#!/usr/bin/env python # -*- coding=utf8 -*- import sys import os import random #input split 1565 #&g ...
- win7旗舰版安装office2007后打开文件提示找不到proplusww.msi
今天第一次打开2007的excel,出现错误如下: 解决办法: 转自:http://blog.163.com/huacai9420@126/blog/static/521585422011911524 ...
- (ASP.NET)C#连接Oracle数据库示例(中文乱码问题解决)
接手了一个遗留的ASP.NET系统,数据库用的是Oracle,以前没搞过.NET和Oracle数据库,数据库搞了半天才解决乱码问题,在此做个笔记备忘. 1.下载安装ODAC 1)请去Oracle官网下 ...
- html——a标签添加点击事件,火狐浏览器直接显示0
一.问题描述 给一个a标签添加了点击事件,页面直接给了0如下图 二.问题解决 后台调试模式下,发现也进了后台方法,也返回了页面. 于是想到先把页面里大部分内容去掉,去掉所有js,查看是否是部分代码有问 ...