实现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++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import