`
castte
  • 浏览: 18615 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

解决jasig CAS server端 ticketGrantingTicket超时后的一个bug

阅读更多
最近研究cas,发现在设置ticketGrantingTicket超时后,打开https://tski.com:8443/cas 仍然显示成功


ticketExpirationPolicies.xml
	<!-- This argument is the time a ticket can exist before its considered expired. 设置为5秒超时-->
	<bean id="grantingTicketExpirationPolicy" class="org.jasig.cas.ticket.support.TimeoutExpirationPolicy">
		
		<constructor-arg
			index="0"
			value="5000" />
	</bean> 


ticketRegistry.xml
<!-- 10秒检查一次是否有ticket需要clean  -->
	<bean id="triggerJobDetailTicketRegistryCleaner" class="org.springframework.scheduling.quartz.SimpleTriggerBean"
		p:jobDetail-ref="jobDetailTicketRegistryCleaner"
		p:startDelay="2000"
		p:repeatInterval="10000" />


仍然显示成功



所以猜测,TGT超时与使用https://tski.com:8443/cas/logout 不同地方在于,后者清除了cookie中的TGT

于是找到logout的处理代码
org.jasig.cas.web.LogoutController
    protected ModelAndView handleRequestInternal(
        final HttpServletRequest request, final HttpServletResponse response)
        throws Exception {
        final String ticketGrantingTicketId = this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request);
        final String service = request.getParameter("service");

        if (ticketGrantingTicketId != null) {
            this.centralAuthenticationService
                .destroyTicketGrantingTicket(ticketGrantingTicketId);
            //清除cookie
            this.ticketGrantingTicketCookieGenerator.removeCookie(response);
            this.warnCookieGenerator.removeCookie(response);
        }

        if (this.followServiceRedirects && service != null) {
            return new ModelAndView(new RedirectView(service));
        }

        return new ModelAndView(this.logoutView);
    }


而TGT超时时,cas server 不能获取cookie

继续猜测,打开https://tski.com:8443/cas时,cas server只判断了cookie中是否有TGT,但是没判断org.jasig.cas.ticket.registry.TicketRegistry中是否还存在TGT。

找到login-webflow.xml
    

<!-- 在flowScope.ticketGrantingTicketId && flowScope.service 为null的情况下,页面会跳转到viewGenericLoginSuccess -->
<on-start>
        <evaluate expression="initialFlowSetupAction" />
    </on-start>

	<decision-state id="ticketGrantingTicketExistsCheck">
		<if test="flowScope.ticketGrantingTicketId neq null" then="hasServiceCheck" else="gatewayRequestCheck" />
	</decision-state>
    
	...	
	<decision-state id="hasServiceCheck">
		<if test="flowScope.service != null" then="renewRequestCheck" else="viewGenericLoginSuccess" />
	</decision-state>


所以现在要确认flowScope.ticketGrantingTicketId , flowScope.service 是什么东西
找到org.jasig.cas.web.flow.InitialFlowSetupAction
	protected Event doExecute(final RequestContext context) throws Exception {
        final HttpServletRequest request = WebUtils.getHttpServletRequest(context);
        if (!this.pathPopulated) {
            ...        }

//ticketGrantingTicketId是从cookie里取的,问题很清楚了
        context.getFlowScope().put(
            "ticketGrantingTicketId", this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request));
        context.getFlowScope().put(
            "warnCookieValue",
            Boolean.valueOf(this.warnCookieGenerator.retrieveCookieValue(request)));
//service 只有在从其他系统跳转到cas server时才可能不是null
        final Service service = WebUtils.getService(this.argumentExtractors,
            context);

        if (service != null && logger.isDebugEnabled()) {
            logger.debug("Placing service in FlowScope: " + service.getId());
        }

        context.getFlowScope().put("service", service);

        return result("success");
    }


最后,修改代码
org.jasig.cas.web.flow.InitialFlowSetupAction
//注入 ticketRegistry
 @NotNull
    private TicketRegistry ticketRegistry;

    public TicketRegistry getTicketRegistry() {
		return ticketRegistry;
	}

	public void setTicketRegistry(TicketRegistry ticketRegistry) {
		this.ticketRegistry = ticketRegistry;
	}



	protected Event doExecute(final RequestContext context) throws Exception {
        final HttpServletRequest request = WebUtils.getHttpServletRequest(context);
        if (!this.pathPopulated) {
            ...        }
//从ticketRegistry中获取TGT
        context.getFlowScope().put(
            "ticketGrantingTicketId", ticketRegistry.getTicket(this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request)));
        context.getFlowScope().put(
            "warnCookieValue",
            Boolean.valueOf(this.warnCookieGenerator.retrieveCookieValue(request)));

        final Service service = WebUtils.getService(this.argumentExtractors,
            context);

        if (service != null && logger.isDebugEnabled()) {
            logger.debug("Placing service in FlowScope: " + service.getId());
        }

        context.getFlowScope().put("service", service);

        return result("success");
    }


修改cas-servlet.xml
<!-- 最后一行 p:ticketRegistry-ref="ticketRegistry"  ,注入ticketRegistry -->
	<bean id="initialFlowSetupAction" class="org.jasig.cas.web.flow.InitialFlowSetupAction"
		p:argumentExtractors-ref="argumentExtractors"
		p:warnCookieGenerator-ref="warnCookieGenerator"
		p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator" 
		p:ticketRegistry-ref="ticketRegistry"/>
  • 大小: 33.7 KB
分享到:
评论
3 楼 yesorno828 2015-02-05  
冬天秋天 写道
我现在有一个比较诡异的问题,在cas超时以后,用户需要做两次登录操作才能成功跳转到主页(在第一次输入用户名和密码之后点击登录,页面又定位到了登录页面没有定位到主页)。

我也遇到这个问题过。。。不知道你解决了吗?
2 楼 冬天秋天 2014-04-10  
我现在有一个比较诡异的问题,在cas超时以后,用户需要做两次登录操作才能成功跳转到主页(在第一次输入用户名和密码之后点击登录,页面又定位到了登录页面没有定位到主页)。
1 楼 rongsheng730 2014-01-24  
你这玩法好像有点误导人啊,ticket生成与授权还没看到,看完再来回复。。。看这文章的慎用哦

相关推荐

    Cas Server 3.4.2 和 Cas Client 3.1.6 的源代码

    如果认证成功,Cas Server 会返回一个服务票证(ST),用户携带此票证访问应用,应用会向 Cas Server 验证票证,验证通过后允许用户访问。 3. **协议支持**:Cas Server 支持多种协议,如 CAS v1、v2、v3,SAML 1.1...

    Jasig(cas)单点登录时序图

    - **grantServiceTicket**:一旦用户认证成功,CAS-Server 将会为请求方生成一个服务票据(ST),这个票据将在后续的服务访问中作为认证凭证。 ##### 4. 后续处理 - **AuthenticationManager**:负责具体的用户...

    jasig cas4.1.4+oracle数据库认证

    Jasig Central Authentication Service(CAS)是一个开源的身份验证框架,主要用于实现单点登录(Single Sign-On, SSO)。它允许用户在一个应用系统中登录后,无需再次认证即可访问其他集成的应用系统。CAS 4.1.4 是...

    cas-server-3.5.2.1-release.zip

    CAS(Central Authentication Service)是 Jasig 组织开发的一个开源的身份验证框架,它提供了一种集中式的、基于Web的单点登录(Single Sign-On, SSO)解决方案。"cas-server-3.5.2.1-release.zip" 是 CAS 服务器的...

    cas:Jasig CAS 4.1 Docker映像,具有战争建立,ldap,数据库和cas管理支持

    #DockerFile用于具有cas-management的JASIG CAS Jasig Cas 4.1映像 ##先决条件 码头工人 JVM和Maven(战争大楼) 码头工人组成 ssl证书 ## image build mvn clean package; docker-compose rm -f; docker-compose ...

    JASIG CAS 3 Learning Note 1 -- getting started

    4. **处理服务验证**:在 CAS 服务器验证用户身份后,会返回一个服务票证(ST),你的应用需要解析这个票证并发送给 CAS 服务器以换取会话票证(TGT),然后才能允许用户访问资源。 在实际应用中,你可能还需要考虑...

    jasig cas 单点登录

    jasig cas 单点登录环境搭建详细资料

    CAS jasig SSO单点登录解决方案完整版

    cas-client-core-3.2.1.jar LoginImpl.java LoginServlet.java SSOClientFilter.java web.xml 电子政务平台单点登录集成手册v4.0-2017年2月9日.docx

    org.jasig.cas.client.util.CommonUtils

    予org.jasig.cas.client.util.CommonUtils 加入 public static void disableSSLVerification(){ try { // Create a trust manager that does not validate certificate chains TrustManager[] ...

    东北大学信息化建设:基于JASIG CAS的统一身份认证系统

    验证成功后,CAS Server会返回一个Ticket给CAS Client,Client再凭此Ticket获取服务。 东北大学通过CAS实现了校园通行证的功能,使得各业务系统之间能够共享用户资源而无需暴露用户密码。此外,CAS还能解决跨域认证...

    cas-server-4.0.0-release单点登录源码和war包-原版

    它允许用户通过一个认证界面访问多个应用系统,而无需在每个系统上分别进行登录。在这个"cas-server-4.0.0-release"压缩包中,包含了CAS服务器的源码和war包,这使得开发者可以深入理解其内部工作原理,并根据需求...

    cas server 4.2.7 环境搭建maven

    `cas-overlay-template-4.2-clean.zip`文件是一个预设的CAS Server overlay模板,解压后将包含CAS的基础结构和默认配置。你可以根据自己的需求修改这些配置,比如更改主题、添加自定义服务验证器等。 Spring ...

    CAS RESTful API 开发文档

    server 地址: ...n 下载 restlet 相关 http://www.restlet.org/downloads/ , 解压后将下面 jar 拷贝到 D:\server\apache-tomcat-6.0.18\webapps\cas\WEB-INF\lib: ( 它奶奶地这一步骤很折腾 ) ...

    jasig-cas-4.0.x-overlay-template:ala-cas从jasig cas 3.4.2升级到4.0.1

    `jasig-cas-4.0.x-overlay-template` 是一个用于辅助升级的模板项目,它可以帮助用户快速搭建与旧版本不同的CAS 4.0.x配置,并提供了一个起点,以便进行自定义和适配。 ### 1. CAS 升级的重要性 升级CAS的主要原因...

    cas-server服务端maven项目

    这是已经调整过的cas服务端,maven项目 已完成内容 登录页面已做调整 验证码功能 记住我功能 多数据源支持(根据传入参数client确定用哪个数据源和sql语句) 运行该项目 先建立sys_account表,直接导入sys_...

    CAS客户端JAR包版本3.3.3

    org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter &lt;param-name&gt;casServerUrlPrefix &lt;param-value&gt;http://192.168.156.120:8080/cas&lt;/param-value&gt; &lt;param-name&gt;serverName ...

    CAS实现内外网映射访问的解决办法

    将下载的`cas-client-core`目录导入到Eclipse或MyEclipse等IDE中,创建一个新的Java项目。需要注意的是,这些源代码项目通常使用Maven进行构建管理。 3. **新增工具类** 在`org.jasig.cas.client.util`包下新增...

    spring boot整合CAS Client实现单点登陆验证的示例

    2. CAS Server 对客户端应用进行身份认证,如果认证成功,将生成一个 Ticket。 3. CAS Server 将 Ticket 返回给客户端应用。 4. 客户端应用使用 Ticket 访问受保护资源。 在 Spring Boot 中,我们可以使用 CAS ...

    jasig-本地环境搭建二-使用简单demo运行

    Jasig 是一个专注于高等教育技术的开源社区,其项目通常涉及身份认证、门户管理和集成解决方案。在这个教程中,我们将主要关注如何设置本地环境并运行一个简单的 Jasig 客户端演示。 首先,理解 Jasig 的核心概念是...

Global site tag (gtag.js) - Google Analytics