`

SSO单点登录系列6:cas单点登录防止登出退出后刷新后退ticket失效报500错

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

问题: 我登录了client2,又登录了client3,现在我把client2退出了,在client3里面我F5刷新了一下,结果页面报错:

未能够识别出目标 'ST-41-2VcnVMguCDWJX5zHaaaD-cas01.example.org'票根

[html] view plaincopy
 
  1. <span style="font-family:Microsoft YaHei;font-size:12px;">type Exception report  
  2.   
  3. message org.jasig.cas.client.validation.TicketValidationException:  
  4.   
  5. description The server encountered an internal error that prevented it from fulfilling this request.  
  6.   
  7. exception  
  8.   
  9. javax.servlet.ServletException: org.jasig.cas.client.validation.TicketValidationException:   
  10.         鏈兘澶熻瘑鍒嚭鐩爣 'ST-41-2VcnVMguCDWJX5zHaaaD-cas01.example.org'绁ㄦ牴  
  11.       
  12.     org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:155)  
  13.     org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:99)  
  14.     org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)  
  15.     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)  
  16. root cause  
  17.   
  18. org.jasig.cas.client.validation.TicketValidationException:   
  19.         鏈兘澶熻瘑鍒嚭鐩爣 'ST-41-2VcnVMguCDWJX5zHaaaD-cas01.example.org'绁ㄦ牴  
  20.       
  21.     org.jasig.cas.client.validation.Cas20ServiceTicketValidator.parseResponseFromServer(Cas20ServiceTicketValidator.java:73)  
  22.     org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator.validate(AbstractUrlBasedTicketValidator.java:188)  
  23.     org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:132)  
  24.     org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:99)  
  25.     org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)  
  26.     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)  
  27. note The full stack trace of the root cause is available in the Apache Tomcat/7.0.37 logs.</span>  


 

猜都能猜出来,我注销了,ticket已经失效了,现在我又发回到server端,它就报错了。(客户端发过去就报错了),以下就是cas ticket失效处理的一个很简单的解决办法,复杂的话,需要修改client源码进行异常处理。

 

1.所以针对这个情况,我只能在web.xml中下手了,(你也可以修改客户端的jar包中的一些java类,自己去做这个异常处理,接收所有在cas使用过程中会出错的处理,全部跳转到错误页面中,让掉线的人重新登录。在这里,我们采用web.xml配置一下)

 

2.这是官网解释:https://wiki.jasig.org/display/CASC/Configuring+the+Jasig+CAS+Client+for+Java+in+the+web.xml 它的解释:

 

The correct order of the filters in web.xml is necessary:

  1. AuthenticationFilter
  2. TicketValidationFilter (whichever one is chosen)
  3. HttpServletRequestWrapperFilter
  4. AssertionThreadLocalFilter

 

意思是说,过滤器链不要错,我之前的那篇教程里cas客户端配置web.xml没有使用这几个过滤器,现在我们重新使用它。

 

3.这是一个哥们之前解释的:我贴出来。

单点登出,客户端配置。我尝试使用SAML作为认证和Ticket校验,但是调试时发现单点登出取标识的方式只能识别CAS的认证和校验。
认证:org.jasig.cas.client.authentication.AuthenticationFilter
校验:org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
过滤器顺序:
1. CAS Single Sign Out Filter
2. CAS Validation Filter
3. CAS Authentication Filter
4. CAS HttpServletRequest Wrapper Filter
5. CAS Assertion Thread Local Filter
特别注意Validation在Authentication之前,因为我使用的是Cas20ProxyReceivingTicketValidationFilter。根据CAS文档描述:If you are using proxy validation, you should map the validation filter before the authentication filter.

 

4.ok,放上我的web.xml文件,废掉之前的cas验证过滤器(CAS Filter)。使用另一个过滤器(CAS Authentication Filter),并且增加另外三个过滤器(CAS Validation Filter,CAS HttpServletRequest Wrapper Filter,CAS Assertion Thread Local Filter),注意过滤器的顺序.

 

[html] view plaincopy
 
  1.   

 

 

[html] view plaincopy
 
  1. <span style="font-family:Microsoft YaHei;font-size:12px;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns="http://java.sun.com/xml/ns/javaee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  5.   
  6.     <!-- 解决中文乱码问题 -->  
  7.     <filter>  
  8.         <filter-name>spring filter</filter-name>  
  9.         <filter-class>  
  10.             org.springframework.web.filter.CharacterEncodingFilter  
  11.         </filter-class>  
  12.         <init-param>  
  13.             <param-name>encoding</param-name>  
  14.             <param-value>UTF-8</param-value>  
  15.         </init-param>  
  16.     </filter>  
  17.     <filter-mapping>  
  18.         <filter-name>spring filter</filter-name>  
  19.         <url-pattern>/*</url-pattern>  
  20.     </filter-mapping>  
  21.     <!-- 解决中文乱码问题 -->  
  22.   
  23.   
  24.     <!--1.用于单点退出 -->  
  25.     <listener>  
  26.         <listener-class>  
  27.             org.jasig.cas.client.session.SingleSignOutHttpSessionListener  
  28.         </listener-class>  
  29.     </listener>  
  30.   
  31.     <filter>  
  32.         <filter-name>CAS Single Sign Out Filter</filter-name>  
  33.         <filter-class>  
  34.             org.jasig.cas.client.session.SingleSignOutFilter  
  35.         </filter-class>  
  36.     </filter>  
  37.   
  38.     <filter-mapping>  
  39.         <filter-name>CAS Single Sign Out Filter</filter-name>  
  40.         <url-pattern>/*</url-pattern>  
  41.     </filter-mapping>  
  42.   
  43.   
  44.   
  45.     <!--2.负责Ticket校验-->  
  46.     <filter>  
  47.         <filter-name>CAS Validation Filter</filter-name>  
  48.         <filter-class>  
  49.             org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter  
  50.         </filter-class>  
  51.         <init-param>  
  52.             <param-name>casServerUrlPrefix</param-name>  
  53.             <param-value>  
  54.                 http://192.168.168.141:8080/casServer  
  55.             </param-value>  
  56.         </init-param>  
  57.         <init-param>  
  58.             <param-name>serverName</param-name>  
  59.             <param-value>192.168.168.141:8080</param-value>  
  60.         </init-param>  
  61.         <init-param>  
  62.             <param-name>useSession</param-name>  
  63.             <param-value>true</param-value>  
  64.         </init-param>  
  65.   
  66.         <init-param>  
  67.             <param-name>exceptionOnValidationFailure</param-name>  
  68.             <param-value>false</param-value>  
  69.         </init-param>  
  70.   
  71.         <init-param>  
  72.             <param-name>redirectAfterValidation</param-name>  
  73.             <param-value>true</param-value>  
  74.         </init-param>  
  75.     </filter>  
  76.   
  77.     <filter-mapping>  
  78.         <filter-name>CAS Validation Filter</filter-name>  
  79.         <url-pattern>/*</url-pattern>  
  80.     </filter-mapping>  
  81.   
  82.     <!-- 3. 单点登录验证 -->  
  83.   
  84.     <filter>  
  85.         <filter-name>CAS Authentication Filter</filter-name>  
  86.         <filter-class>  
  87.             org.jasig.cas.client.authentication.AuthenticationFilter  
  88.         </filter-class>  
  89.         <init-param>  
  90.             <param-name>casServerLoginUrl</param-name>  
  91.             <param-value>  
  92.                 http://192.168.168.141:8080/casServer/login  
  93.             </param-value>  
  94.         </init-param>  
  95.         <init-param>  
  96.             <param-name>serverName</param-name>  
  97.             <param-value>http://192.168.168.141:8080</param-value>  
  98.         </init-param>  
  99.     </filter>  
  100.     <filter-mapping>  
  101.         <filter-name>CAS Authentication Filter</filter-name>  
  102.         <url-pattern>/*</url-pattern>  
  103.     </filter-mapping>  
  104.   
  105.   
  106.   
  107.     <!-- 3.用于单点登录 去服务器端认证(之前使用的这种)  
  108.             <filter>  
  109.             <filter-name>CAS Filter</filter-name>  
  110.             <filter-class>  
  111.             edu.yale.its.tp.cas.client.filter.CASFilter  
  112.             </filter-class>  
  113.             <init-param>  
  114.             <param-name>  
  115.             edu.yale.its.tp.cas.client.filter.loginUrl  
  116.             </param-name>  
  117.             <param-value>  
  118.             http://192.168.168.141:8080/casServer/login  
  119.             </param-value>  
  120.             </init-param>  
  121.             <init-param>  
  122.             <param-name>  
  123.             edu.yale.its.tp.cas.client.filter.validateUrl  
  124.             </param-name>  
  125.             <param-value>  
  126.             http://192.168.168.141:8080/casServer/serviceValidate  
  127.             </param-value>  
  128.             </init-param>  
  129.             <init-param>  
  130.             <param-name>  
  131.             edu.yale.its.tp.cas.client.filter.serverName  
  132.             </param-name>  
  133.             <param-value>192.168.168.141:8080</param-value>  
  134.             </init-param>  
  135.             </filter>  
  136.         -->  
  137.   
  138.   
  139.     <!--4.  CAS HttpServletRequest Wrapper Filter 这个是HttpServletRequet的包裹类,让他支持getUserPrincipal,getRemoteUser方法来取得用户信息-->  
  140.   
  141.     <filter>  
  142.         <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  
  143.         <filter-class>  
  144.             org.jasig.cas.client.util.HttpServletRequestWrapperFilter  
  145.         </filter-class>  
  146.     </filter>  
  147.   
  148.     <filter-mapping>  
  149.         <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  
  150.         <url-pattern>/*</url-pattern>  
  151.     </filter-mapping>  
  152.   
  153.   
  154.     <!--5. CAS Assertion Thread Local Filter  这个类把Assertion信息放在ThreadLocal变量中,这样应用程序不在web层也能够获取到当前登录信息-->  
  155.   
  156.     <filter>  
  157.         <filter-name>CAS Assertion Thread Local Filter</filter-name>  
  158.         <filter-class>  
  159.             org.jasig.cas.client.util.AssertionThreadLocalFilter  
  160.         </filter-class>  
  161.     </filter>  
  162.   
  163.     <filter-mapping>  
  164.         <filter-name>CAS Assertion Thread Local Filter</filter-name>  
  165.         <url-pattern>/*</url-pattern>  
  166.     </filter-mapping>  
  167.   
  168.   
  169.     <servlet>  
  170.         <servlet-name>Query</servlet-name>  
  171.         <servlet-class>servlet.Query</servlet-class>  
  172.     </servlet>  
  173.   
  174.     <servlet-mapping>  
  175.         <servlet-name>Query</servlet-name>  
  176.         <url-pattern>/query</url-pattern>  
  177.     </servlet-mapping>  
  178.   
  179.     <welcome-file-list>  
  180.         <welcome-file>index.jsp</welcome-file>  
  181.     </welcome-file-list>  
  182. </web-app>  
  183. </span>  

5.如果这样做了,你还需要一件事情,就是前台获取用户信息的方式改了,我的index.jsp改成了这个:

 

 

 

[java] view plaincopy
 
  1. <span style="font-family:Microsoft YaHei;font-size:12px;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
  2. <%@page import="edu.yale.its.tp.cas.client.filter.CASFilter"%>  
  3. <%@page import="org.jasig.cas.client.util.AssertionThreadLocalFilter"%>  
  4. <%@page import="org.jasig.cas.client.util.HttpServletRequestWrapperFilter"%>  
  5. <%@page import="org.jasig.cas.client.authentication.AttributePrincipal"%>  
  6. <%@page import="org.jasig.cas.client.util.AbstractCasFilter"%>  
  7. <%@page import="org.jasig.cas.client.validation.Assertion"%>  
  8.   
  9.   
  10. <body>  
  11.   
  12.         <h1>  
  13.             登录成功,这是客户端2  
  14.         </h1>  
  15.         <br />  
  16.   
  17.         欢迎您:  
  18.   
  19.         <%  
  20.             //String username = (String) session.getAttribute(CASFilter.CAS_FILTER_USER);  
  21.             //String username2 = (String)AssertionHolder.getAssertion().getPrincipal().getName();  
  22.             String username = "";  
  23.              AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();  
  24.              if(principal != null){  
  25.                username = principal.getName();//获取用户名  
  26.              }  
  27.               
  28.            
  29.               
  30.         %>  
  31.         用户名:<%=username%></span>  

ok,我的应用之间如果一个退出,另一个就算带ticket参数也不不再报错了,就算是测试组的兄弟拿到那段ticket复制粘贴到另一个浏览器中进行访问,也不会报错。

 

ps:

也有兄弟说可以通过修改C:\tomcat7\webapps\casServer\WEB-INF\spring-configuration\ticketExpirationPolicies.xml这个文件中的

 

 

[html] view plaincopy
 
  1.   <!-- Expiration policies -->  
  2.     <util:constant id="SECONDS" static-field="java.util.concurrent.TimeUnit.SECONDS"/>  
  3.     <bean id="serviceTicketExpirationPolicy" class="org.jasig.cas.ticket.support.MultiTimeUseOrTimeoutExpirationPolicy"  
  4.           c:numberOfUses="1" c:timeToKill="${st.timeToKillInSeconds:10}" c:timeUnit-ref="SECONDS"/>  
其中那个

 

 c:numberOfUses="1" //使用ticket多少次

 c:timeToKill="${st.timeToKillInSeconds:10}" //多少秒过期,默认10秒,你把这个改成10分钟玩玩。

这个方法我没有尝试,所以希望想尝试想折腾和想玩的兄弟狠狠的点击这个链接:http://bbs.csdn.net/topics/390111112

分享到:
评论

相关推荐

    落雨博客基于CAS框架的单点登录技术讲解(ppt+code实例+doc)配套资料

    [置顶] SSO单点登录系列3:cas-server端配置认证方式实践(数据源+自定义java类认证) http://blog.csdn.net/ae6623/article/details/8851801 [置顶] SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas...

    单点登录&单点登出(Cookie+ticket)

    在本项目中,"单点登录&单点登出(Cookie+ticket)"是通过Servlet技术实现的,利用Cookie和Ticket这两种机制来处理SSO的过程。 Cookie是Web应用中用于跟踪用户状态的一种常见方法。在SSO场景下,当用户首次登录SSO...

    CAS实现sso单点登录原理

    "CAS实现sso单点登录原理" CAS(Central Authentication Service)是Yale大学发起的一个企业级的、开源的项目,旨在为Web应用系统提供一种可靠的单点登录解决方法(属于Web SSO)。CAS开始于2001年,并在2004年12月...

    Java进阶SSO单点登录技术CAS-快速上手与原理探究视频教程

    3、 单点登录和单点登出的实现和测试 4、 单点登录、登出的原理探究等 知识点 l 相关概念或术语:SSO、CAS、TGT、TGC、ST l CAS Server服务端的搭建和配置 l CAS Client客户端的搭建和配置 l 单点登录的测试 l 单点...

    cas实现单点登录,登出(java和php客户端)

    - **登出**:单点登出(Single Logout, SLO)需要确保用户在一处登出时,其他所有已登录的资源也同时失效。CAS支持SLO,客户端需要正确处理登出请求和清除本地会话。 - **测试**:对SSO系统进行全面的功能和安全测试...

    SSO 单点登录(java)

    SSO(Single Sign-On)单点登录是一种身份验证机制,允许用户在一次登录后,能够访问多个相互关联的应用系统,而无需再次输入凭证。在Java环境下实现SSO,通常涉及以下几个核心知识点: 1. **原理**:SSO的核心思想...

    单点登录demo

    单点登录(Single Sign-On,简称SSO)是一种网络身份验证机制,允许用户在一个系统或应用中登录后,无需再次输入凭证即可访问其他相互信任的系统或应用。它简化了用户管理和提升了用户体验,同时减少了密码管理的...

    关于SSO单点登录的简单实现

    SSO(Single Sign-On)单点登录是一种身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次进行身份验证。这个过程提高了用户体验,同时也简化了安全管理。在本文中,我们将探讨SSO的基本原理...

    sso单点登录ppt.ppt

    sso单点登录ppt.ppt

    PHP 使用TP5.0 实现SSO单点登录

    因为公司要实现SSO单点登录的效果,最近在网上找了一些资料,但是都没有好用的, 所以自己用PHP 使用TP5.0 实现了SSO单点登录,可以跨多个域名。 下载后在本地配置好 A,B,C 3个网站,就可以模拟效果了。

    单点登录sso-shiro-cas-maven

    spring下使用shiro+cas配置单点登录,多个系统之间的访问,每次只需要登录一次 ## 系统模块说明 1. cas: 单点登录模块,这里直接拿的是cas的项目改了点样式而已 2. doc: 文档目录,里面有数据库生成语句,采用的...

    用cas实现mantis单点登录和登出

    ### 使用 CAS 实现 Mantis 单点登录与登出 #### 概述 单点登录(Single Sign-On,简称 SSO)是一种常见的身份认证模式,它允许用户在多个应用程序和服务中仅通过一次登录就能访问所有相关系统而无需多次输入密码。...

    sso.rar_DotNetCasClient.dll_sso_sso 单点登录_单点登录_鍗曠偣鐧诲綍

    单点登录(Single Sign-On,简称SSO)是一种网络身份验证技术,允许用户在一次登录后,无需再次输入凭证即可访问多个相互关联的应用系统。在IT领域,它极大地提升了用户体验和安全性,尤其对于大型企业或组织,管理...

    SSO单点登录源码

    SSO(Single Sign-On)单点登录是一种网络应用的认证技术,它允许用户在一个系统或应用中登录后,无需再次输入凭证即可访问其他相互信任的系统。这种技术简化了用户的登录流程,提高了用户体验,同时也降低了管理多...

    用CAS实现框架的SSO单点登录

    ### 用CAS实现框架的SSO单点登录 #### SSO单点登录概念与原理 SSO(Single Sign-On)即单点登录技术,是一种让用户只需登录一次即可访问多个关联应用的技术。它不仅提升了用户体验,同时也加强了系统的安全性。...

    Weblogic使用YALE(耶鲁)CAS实现SSO单点登录 的方法.doc

    Weblogic 使用 YALE CAS 实现 SSO 单点登录的方法 一、Yale CAS 简介 Yale CAS 是耶鲁大学开发的一种开源的单点登录(SSO)解决方案,提供了一个通用的身份验证框架,允许用户使用单个身份验证来访问多个应用程序。...

    SSO之CAS单点登录详细图文教程

    8. **单点登出(SLO)**:除了单点登录,CAS还支持单点登出功能,允许用户在任何一处登出时,同时从所有已认证的系统中注销。 9. **扩展性和自定义**:CAS支持多种身份验证协议,如LDAP、数据库、Active Directory...

    cas sso单点登录已搭建好的源码-内含客户端和服务端

    4. 退出逻辑:实现单点登出功能,当用户在一个应用中注销时,客户端会通知其他应用同步注销状态。 在源码中,开发者可以深入理解CAS SSO的工作流程,包括: - 如何配置CAS服务器,设置认证源和策略。 - 客户端如何...

    sso单点登录源代码

    SSO(Single Sign-On)单点登录是一种网络认证机制,允许用户在一次登录后,就能访问多个相互关联的应用系统,而无需再次输入凭证。这种技术极大地提升了用户体验,减少了记忆和输入多个用户名和密码的麻烦,同时也...

    转载CAS_SSO单点登录实例详细步骤

    4. **Ticket验证**:CAS服务器验证用户后,返回一个票据(Ticket),应用系统收到Ticket后,会向CAS服务器验证Ticket的合法性,确认用户已授权。 ### CAS_SSO工作原理 - 用户首次尝试访问受CAS保护的应用系统时,...

Global site tag (gtag.js) - Google Analytics