实现CAS单点登出

2023-11-20 14:08
文章标签 实现 单点 登出 cas

本文主要是介绍实现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中加入如下代码

[xhtml]  view plain copy
  1. <filter>  
  2.    <filter-name>CAS Single Sign Out Filter</filter-name>  
  3.    <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>  
  4. </filter>  
  5.   
  6. <filter-mapping>  
  7.    <filter-name>CAS Single Sign Out Filter</filter-name>  
  8.    <url-pattern>/*</url-pattern>  
  9. </filter-mapping>  
  10.   
  11. <listener>  
  12.     <listener-class>  
  13.        org.jasig.cas.client.session.SingleSignOutHttpSessionListener  
  14.     </listener-class>  
  15. </listener>  

 

 

在我们的项目中由于结合了SpringSecurity 可以将filter加入到spring Security过滤链中,也可以直接向上面的一样加入web.xml中

首先在web.xml中加入监听器。

[xhtml]  view plain copy
  1. <!-- single sign out -->  
  2. <listener>  
  3.       <listener-class>  
  4.           org.jasig.cas.client.session.SingleSignOutHttpSessionListener  
  5.       </listener-class>  
  6. </listener>  
  7. <!-- single sign out -->  

 

然后把filter加入到spring Security过滤链中

 

[xhtml]  view plain copy
  1. <!-- single sign out -->  
  2. <b:bean id="casSingleSignOutFilter" class="check.SingleSignOutFilter">  
  3.     <custom-filter before="CAS_PROCESSING_FILTER"/>  
  4. </b:bean>  
  5. <!-- single sign out -->  

 

注意上面的class="check.SingleSignOutFilter"是我自定义的filter(由于CAS3.1.3定义的SingleSignOutFilter在某种意思上没有起到作用)详情请见http://www.javaeye.com/topic/546785

自己定义一个类

[java]  view plain copy
  1. package check;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Enumeration;  
  5.   
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpSession;  
  13.   
  14. import org.apache.commons.logging.Log;  
  15. import org.apache.commons.logging.LogFactory;  
  16. import org.jasig.cas.client.session.HashMapBackedSessionMappingStorage;  
  17. import org.jasig.cas.client.session.SessionMappingStorage;  
  18. import org.jasig.cas.client.util.AbstractConfigurationFilter;  
  19. import org.jasig.cas.client.util.CommonUtils;  
  20. import org.jasig.cas.client.util.XmlUtils;  
  21.   
  22. public final class SingleSignOutFilter extends AbstractConfigurationFilter  
  23. {  
  24.   private String artifactParameterName;  
  25.   private static SessionMappingStorage SESSION_MAPPING_STORAGE = new HashMapBackedSessionMappingStorage();  
  26.   private static Log log = LogFactory.getLog(SingleSignOutFilter.class);  
  27.   
  28.   public SingleSignOutFilter()  
  29.   {  
  30.     this.artifactParameterName = "ticket";  
  31.   }  
  32.   
  33.   public void init(FilterConfig filterConfig)  
  34.     throws ServletException  
  35.   {  
  36.     setArtifactParameterName(getPropertyFromInitParams(filterConfig, "artifactParameterName""ticket"));  
  37.     init();  
  38.   }  
  39.   
  40.   public void init() {  
  41.     CommonUtils.assertNotNull(this.artifactParameterName, "artifactParameterName cannot be null.");  
  42.     CommonUtils.assertNotNull(SESSION_MAPPING_STORAGE, "sessionMappingStorage cannote be null.");  
  43.   }  
  44.   
  45.   public void setArtifactParameterName(String artifactParameterName) {  
  46.     this.artifactParameterName = artifactParameterName;  
  47.   }  
  48.   
  49.   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  
  50.     final HttpServletRequest request = (HttpServletRequest) servletRequest;     
  51.     final String logoutRequest = CommonUtils.safeGetParameter(request, "logoutRequest");     
  52.     Enumeration ff = request.getParameterNames();     
  53.     String a = request.getQueryString();     
  54.     if (CommonUtils.isNotBlank(logoutRequest)) {     
  55.          final String sessionIdentifier = XmlUtils.getTextForElement(logoutRequest, "SessionIndex");     
  56.   
  57.          if (CommonUtils.isNotBlank(sessionIdentifier)) {     
  58.             final HttpSession session = SESSION_MAPPING_STORAGE.removeSessionByMappingId(sessionIdentifier);     
  59.   
  60.             if (session != null) {     
  61.                  String sessionID = session.getId();                        
  62.                  try {     
  63.                     session.invalidate();     
  64.                  } catch (final IllegalStateException e) {     
  65.                          
  66.                  }     
  67.             }     
  68.          }     
  69.      }     
  70.          
  71.     else{     
  72.         final String artifact = CommonUtils.safeGetParameter(request, this.artifactParameterName);     
  73.         final HttpSession session = request.getSession(false);     
  74.              
  75.         if (CommonUtils.isNotBlank(artifact) && session!=null) {     
  76.             try {     
  77.                 SESSION_MAPPING_STORAGE.removeBySessionById(session.getId());     
  78.             } catch (final Exception e) {     
  79.                      
  80.             }     
  81.             SESSION_MAPPING_STORAGE.addSessionById(artifact, session);     
  82.         }     
  83.     }     
  84.   
  85.     filterChain.doFilter(servletRequest, servletResponse);     
  86.   }  
  87.   
  88.   public void setSessionMappingStorage(SessionMappingStorage storage) {  
  89.     SESSION_MAPPING_STORAGE = storage;  
  90.   }  
  91.   
  92.   public static SessionMappingStorage getSessionMappingStorage() {  
  93.     return SESSION_MAPPING_STORAGE;  
  94.   }  
  95.   
  96.   public void destroy()  
  97.   {  
  98.   }  
  99. }  

完成。

这样即可实现单点登出。(所有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中的点击事件里面代码如下:

[php]  view plain copy
  1. if(!$admin && CAS_ENABLE){  
  2.     // initialize phpCAS   
  3.     phpCAS::client(CAS_VERSION_2_0, CAS_SERVER_HOSTNAME, CAS_SERVER_PORT, CAS_SERVER_APP_NAME);   
  4.     phpCAS::setNoCasServerValidation();   
  5.     // force CAS authentication   
  6.     phpCAS::handleLogoutRequests();//加的去看看有没有服务器端发出注销消息。  
  7.     phpCAS::forceAuthentication();   

这篇关于实现CAS单点登出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/395155

相关文章

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso

SpringBoo WebFlux+MongoDB实现非阻塞API过程

《SpringBooWebFlux+MongoDB实现非阻塞API过程》本文介绍了如何使用SpringBootWebFlux和MongoDB实现非阻塞API,通过响应式编程提高系统的吞吐量和响应性能... 目录一、引言二、响应式编程基础2.1 响应式编程概念2.2 响应式编程的优势2.3 响应式编程相关技术

C#实现将XML数据自动化地写入Excel文件

《C#实现将XML数据自动化地写入Excel文件》在现代企业级应用中,数据处理与报表生成是核心环节,本文将深入探讨如何利用C#和一款优秀的库,将XML数据自动化地写入Excel文件,有需要的小伙伴可以... 目录理解XML数据结构与Excel的对应关系引入高效工具:使用Spire.XLS for .NETC

Nginx更新SSL证书的实现步骤

《Nginx更新SSL证书的实现步骤》本文主要介绍了Nginx更新SSL证书的实现步骤,包括下载新证书、备份旧证书、配置新证书、验证配置及遇到问题时的解决方法,感兴趣的了解一下... 目录1 下载最新的SSL证书文件2 备份旧的SSL证书文件3 配置新证书4 验证配置5 遇到的http://www.cppc

Nginx之https证书配置实现

《Nginx之https证书配置实现》本文主要介绍了Nginx之https证书配置的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录背景介绍为什么不能部署在 IIS 或 NAT 设备上?具体实现证书获取nginx配置扩展结果验证

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1