`

cas tgt session失效时间

阅读更多

1 错误场景                                   

     cas session 超时问题:XMLHttpRequest cannot loadhttps://www.hf.com:8443/cas/login?service=http%3A%2F%2Flocalhost%3A8080%2Fvms%2Fcheck%2FfindPendingCheck%2F. No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘http://localhost:8080‘ is therefore not allowed access.

    部署问题:用nginx封装,service携带不过来。

 2 cas 针对session超时设置                       

    cas对于session超时设置,可以设置文件cas/WEB-INF/spring-configuration/ticketExpirationPolicies.xml 进行设置,如下所示:

[html] view plaincopyprint?

 

  1. <bean id=“grantingTicketExpirationPolicy” class=“org.jasig.cas.ticket.support.RememberMeDelegatingExpirationPolicy”>  
  2.        <property name=“sessionExpirationPolicy”>  
  3.            <bean class=“org.jasig.cas.ticket.support.TimeoutExpirationPolicy”>  
  4.             <constructor-arg index=“0” value=“20000” />  
  5.                     </bean>  
  6.        </property>  
[html] view plaincopyprint?

 

  1. <bean id=“serviceTicketExpirationPolicy” class=“org.jasig.cas.ticket.support.MultiTimeUseOrTimeoutExpirationPolicy”>  
  2.     <!– This argument is the number of times that a ticket can be used before its considered expired. –>  
  3.     <constructor-arg  
  4.         index=“0”  
  5.         value=“1” />  
  6.       
  7.     <!– This argument is the time a ticket can exist before its considered expired.  –>  
  8.     <constructor-arg  
  9.         index=“1”  
  10.         value=“20000” />  
  11. </bean>  

    上述两个bean中,设置为20000毫秒(设置超时单位为毫秒),上述另个bean的机制就如同session机制一样,当用户没有与服务器的交互超过20秒,点击url,便会自动转到登录界面。单只是设置这一点是不够的,会有问题的。

    问题:当你的项目中也有对session的设置,以及对session时间的设置的时候,只设置cas的session超时是不管事的。

 3 配置完毕,对于ajax请求出现的错误        

    问 题的解决:所以我们需要把项目中session超时的时间和cas session超时的时间设置为一致,因为cas对session超时的处理,是在cas-client-core-3.2.1.jar 包中,而cas的客户端是和项目放在一起的,所以对session处理机制是一样的。

 

    当然上述的处理一般情况下是没有问题的,但当遇到ajax请求,就不可以了,会报如下错误:

XMLHttpRequest cannot load https://www.hf.com:8443/cas/login?service=http%3A%2F%2Flocalhost%3A8080%2Fvms%2Fcheck%2FfindPendingCheck%2F. No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘http://localhost:8080′ is therefore not allowed access.

    千 万别被Origin蒙蔽,开始定位错误定位在跨域问题,因为网上查找说也是跨域问题,而实际上对于非ajax请求,cas拦截处理后是可以跳转到登录页面 的,这说明了是可以请求给cas的,只不过cas对ajax的请求无法做出session失效的处理,这怎么办呢?只能去改CAS源码了。不知道是cas 矮,还是自己太矮了。。。

 4 修改CAS源码,解决上述问题   

    经过查看错误日志,找到cas打印日志的地方,找到cas处理session的方法,修改的是/CAS_Client/src/org/jasig/cas/client/authentication/AuthenticationFilter.java这个java类。修改的doFilter方法如下所示。

[java] view plaincopyprint?

 

  1. public final void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {  
  2.       final HttpServletRequest request = (HttpServletRequest) servletRequest;  
  3.       final HttpServletResponse response = (HttpServletResponse) servletResponse;  
  4.       final HttpSession session = request.getSession(false);  
  5.       final Assertion assertion = session != null ? (Assertion) session.getAttribute(CONST_CAS_ASSERTION) : null;  
  6.   
  7.       if (assertion != null) {  
  8.           filterChain.doFilter(request, response);  
  9.           return;  
  10.       }  
  11.   
  12.       final String serviceUrl = constructServiceUrl(request, response);  
  13.       final String ticket = CommonUtils.safeGetParameter(request,getArtifactParameterName());  
  14.       final boolean wasGatewayed = this.gatewayStorage.hasGatewayedAlready(request, serviceUrl);  
  15.   
  16.       if (CommonUtils.isNotBlank(ticket) || wasGatewayed) {  
  17.           filterChain.doFilter(request, response);  
  18.           return;  
  19.       }  
  20.   
  21.       final String modifiedServiceUrl;  
  22.   
  23.       log.debug(“no ticket and no assertion found”);  
  24.       if (this.gateway) {  
  25.           log.debug(“setting gateway attribute in session”);  
  26.           modifiedServiceUrl = this.gatewayStorage.storeGatewayInformation(request, serviceUrl);  
  27.       } else {  
  28.           modifiedServiceUrl = serviceUrl;  
  29.       }  
  30.       if (log.isDebugEnabled()) {  
  31.           log.debug(“Constructed service url: “ + modifiedServiceUrl);  
  32.       }  
  33.         
  34.       final String urlToRedirectTo = CommonUtils.constructRedirectUrl(this.casServerLoginUrl, getServiceParameterName(), modifiedServiceUrl, this.renew, this.gateway);  
  35.   
  36.       if (log.isDebugEnabled()) {  
  37.           log.debug(“redirecting to /”” + urlToRedirectTo + “/””);  
  38.       }  
  39.         
  40.       log.debug(“判断拼接的过程,参数, 最终拼接好的地址为: /”” + urlToRedirectTo + “/””);  
  41.         
  42.       //response.sendRedirect(urlToRedirectTo);  
  43.       String url = request.getRequestURL().toString();  
  44.       log.debug(“url——request.getRequestURL().toString()=———:” + url);  
  45.       String contextPath = request.getContextPath();  
  46.       log.debug(“contextPath ———request.getContextPath()=——-:” + contextPath);  
  47.         
  48.       url = url.substring(0, (url.indexOf(contextPath)+contextPath.length()));  
  49.       log.debug(“url = ——session消失,截取到项目的url—“ + url);  
  50.       String urls = urlToRedirectTo;  
  51.         
  52.       //判断是否是第一次转到.  
  53.       if(“”.equals(url)||url==null||url.length()==0){  
  54.           
  55.         log.debug(“url–第一次为空,不截取—–“ + url);  
  56.         urls = urlToRedirectTo;  
  57.         //response.sendRedirect(urlToRedirectTo);  
  58.       }else{  
  59.         urls = urls.substring(0, (urls.indexOf(“service=”)+8)) + URLEncoder.encode(url,“UTF-8″);  
  60.       }  
  61.         
  62.       log.debug(“urls –最终输入到浏览器的地址是———–“ + urls);  
  63.         
  64. response.setContentType(“text/html;charset=UTF-8″);  
  65. response.getWriter().write(“<script languge=’javascript’>window.location.href='”+urls+“/'</script>”);  
  66.   }  

 

    这样不但解决了cas对ajax地址处理,并且解决了另一个问题,因为最初的改动不是上述的代码,中间出现了一个小插曲,部署的时候出现的bug,登录时service参数携带不过来。当我们把项目部署到linux上时,用nginx代理,并配置tomcat的sever.xml文件封装项目名称, 则样,域名“封装”了ip+端口号+项目名称,用户不需要再输入项目名称了。所以代码中对用户第一次登录做判断,判断是否是第一次登录还是session失效调用的这个方法,这样就解决了nginx代理出现的问题了。

 5  总结                                          

 

1)TGT时间:

 

在ticketExpirationPolicies.xml中,

 

 

 

<bean id=”grantingTicketExpirationPolicy” class=”org.jasig.cas.ticket.support.TimeoutExpirationPolicy”>

 

 <!– This argument is the time a ticket can exist before its considered expired.  –>

 

 <constructor-arg

 

  index=”0″

 

  value=”7200000″ />

 

</bean>

 

这里进行设置的时间是TGT(ticket granting ticket)的时间,如果TGT时间到期,则需要进行重新登录。这里时间单位是毫秒,默认是两小时。

 

如果进行了rememberMe配置,则是在

 

<bean id=”grantingTicketExpirationPolicy” class=”org.jasig.cas.ticket.support.RememberMeDelegatingExpirationPolicy”>

 

   

 

   <!– 一般情况下的 cas session 实效时间 –>

 

   <property name=”sessionExpirationPolicy”>

 

    <bean class=”org.jasig.cas.ticket.support.TimeoutExpirationPolicy”>

 

           <constructor-arg index=”0″ value=”60000″ />

 

    </bean>

 

   </property>

 

   <!– 全天免登录 情况下 cas session的实效时间 –>

 

   <property name=”rememberMeExpirationPolicy”>

 

    <bean class=”org.jasig.cas.ticket.support.TimeoutExpirationPolicy”>

 

           <constructor-arg index=”0″ value=”1209600000″ />

 

    </bean>

 

   </property>

 

</bean>

 

中的sessionExpirationPolicy进行配置。

 

 

 

2)rememberMe时间(记住登录状态时间)

 

在上面的rememberMeExpirationPolicy中进行配置。时间单位是毫秒。然后在ticketGrantingTicketCookieGenerator.xml中的

 

<bean id=”ticketGrantingTicketCookieGenerator” class=”org.jasig.cas.web.support.CookieRetrievingCookieGenerator”

 

  p:cookieSecure=”false”

 

  p:cookieMaxAge=”-1″

 

  p:cookieName=”CASTGC”

 

  p:cookiePath=”/cas” 

 

  p:rememberMeMaxAge=”1209600″/>

 

p:rememberMeMaxAge进行配置,两者时间保持一致,注意这里的时间单位是秒。
 
原文出处:http://www.fwqtg.net/关于cas单点登录超时处理总结.html
分享到:
评论

相关推荐

    cas的部署规则

    - CAS服务器收到注销请求后,会从session中移除所有加入单点登录范围内的session ID,并调用各应用接口销毁session中的TGT,同时使浏览器端的TGC失效。 - 下次用户访问任何应用时,流程将重新开始。 #### 四、CAS...

    CAS Protocol 3.0 Specification.docx 官方中文版教程详解

    - **renew [可选]**:若设置此参数,无论是否存在SSO session,CAS都会要求用户提供凭证,不使用已有的登录状态。 **协议流程** 1. 用户尝试访问受CAS保护的服务。 2. 服务将用户重定向到CAS服务器的/login URI。 ...

    cas服务端和客户端可用代码

    CAS(Central Authentication Service)是一种基于Web的单一登录(Single Sign-On, SSO)协议,它允许用户通过一个统一的身份验证入口点登录,然后在多个应用系统间自由切换,而无需再次进行身份验证。这个给定的...

    CAS破解思路

    描述了CAS破解的具体思路,可以帮助用户找到破解CAS的具体办法

    cas4.1.x集成mysql,ldap,redis(session和票据),写了简单的两个客户端demo

    在这个场景下,它被用来存储用户会话(session)和票据(Ticket Granting Ticket,简称TGT)。 - 会话管理:通过将用户的会话信息序列化并存储在Redis中,可以实现跨服务器的会话共享,提高系统的可扩展性。 - ...

    CAS原理和配置过程

    如果发现TGC存在但session中无TGT,则`test2`同样会重定向用户至CAS服务器。CAS服务器通过TGT生成新的ST并将其发回`test2`,后者完成验证过程。 6. **注销**:用户在任一应用中选择注销时,应用会通知CAS服务器,...

    CAS 协议 票据、url介绍,包括cas1.0和cas2.0

    TGT 是 CAS 服务器颁发给用户的身份验证凭证,ST 是 CAS 服务器颁发给用户的服务凭证,PT 是 CAS 服务器颁发给用户的代理凭证。 URL CAS 协议的 URL 是指 CAS 服务器提供的 HTTP 服务端点。CAS 协议的 URL 可以...

    CAS单点登录(SSO)服务端自定义认证+CAS客户端配置+CAS完整使用文档+CAS4.2.7 cas-serv服务端源码 cas-client客户端源码

    压缩包中包含的文档将指导你如何配置CAS客户端,包括在Spring或Web.xml中添加必要的配置项,设置服务URL,以及处理TGT(Ticket Granting Ticket)和ST(Service Ticket)。 3. **CAS4.2.7源码**: CAS 4.2.7是CAS...

    CAS restful接口调用

    TGT是CAS系统中的一个重要概念,用于后续的服务票证(Service Ticket,简称ST)的获取。获取TGT的过程通常分为以下几个步骤: 1. **使用Postman插件**:推荐使用Google Chrome浏览器的Postman插件进行RESTful API的...

    CAS Server 4.1二次开发说明文档.docx

    3. **认证成功后的处理**:用户通过登录验证后,CAS Server会生成Ticket Granting Ticket (TGT) 和随机的Service Ticket (ST),并将ST作为参数附带回用户的原始请求,同时在用户的浏览器中设置一个包含TGT的Cookie。...

    搭建cas服务,cas与sqlserver连接,cas与security连接

    CAS服务器负责处理用户的身份验证请求,并在用户成功验证后提供服务票据(Ticket Granting Ticket, TGT),使得用户在访问多个受保护应用时只需登录一次。以下是搭建CAS服务的步骤: 1. **环境准备**:确保你的开发...

    cas自定义登录页面

    这通过跟踪TGT来实现,当用户在任一系统登出时,CAS会撤销TGT,使得其他系统无法再使用此票证。 在CAS 3.5.2版本中,还包含了一些关键特性,例如支持多种认证机制(如LDAP、JDBC等),可扩展的服务注册,以及对不同...

    cas客户端集成单点登录代码3

    5. 登出流程:登出时,客户端应用会引导用户至CAS服务器的登出页面,服务器会清除TGT,这样用户在所有已集成CAS的应用中都会被登出。同时,客户端应用也应清除本地会话,确保完全登出。 6. TGT与Session管理:TGT是...

    Yelu 大学 cas 单点登录实例

    - CAS服务器会定期清理过期的TGT,防止长期未使用的会话导致的安全风险。 5. **安全性与扩展性** - CAS支持多种身份验证协议,如LDAP、JDBC、SPNEGO等,可根据Yelu大学的具体需求进行选择。 - 通过服务注册,CAS...

    CAS(SSO)-.zip_CAS_CAS SSO_java sso_sso java

    3. **认证票证(TGT)**:当用户成功登录CAS服务器时,服务器会生成一个TGT,这个票证是加密的,包含了用户的身份信息。TGT存储在用户的浏览器会话中,用于后续的服务请求。 4. **服务票证(ST)**:当用户尝试访问...

    cas java cas java 实例

    - TGT:用户首次登录时,CAS服务器生成的会话票据,存储在用户的浏览器中,用于后续的单点登出(Single Sign-Out, SSO)和二次认证。 2. CAS工作原理: - 用户尝试访问受保护的服务。 - 服务将用户重定向到CAS...

    cas整合实例

    同时,理解CAS的工作流程,如TGT(Ticket Granting Ticket)和ST(Service Ticket)的概念,将有助于你更好地调试和优化系统。 总的来说,CAS整合涉及到客户端和服务器端的配置,以及对用户认证流程的理解和定制。...

    cas修改登录页

    1. **CAS架构理解**:首先,你需要了解CAS的基本架构,包括服务器端和客户端组件,以及它们如何通过Ticket Granting Ticket(TGT)和Service Ticket进行通信,实现用户认证。 2. **CAS配置**:修改登录页通常涉及...

    cas客户端jar包

    5. **Service Ticket (ST)**:针对特定服务的票证,由TGT换取,用于证明用户已通过CAS服务器的验证。 接下来,我们深入探讨如何使用CAS客户端jar包集成到Java应用中: 1. **添加依赖**:将提供的jar包添加到项目...

    比较详细的中文cas协议介绍

    2. **登录与TGT创建**:用户在CAS服务器上输入凭据并登录,CAS服务器创建TGT,并将其保存在TGC中发送回浏览器。 3. **ST请求与分配**:当用户再次访问服务时,服务向CAS服务器请求ST,CAS验证TGT后,分配ST给服务。 ...

Global site tag (gtag.js) - Google Analytics