cas login-webflow.xml分析。关于TGT何时生成和存储。

1.首先设置一个变量credentials,保存账号密码等信息。

2.执行initialFlowSetupAction的doExecute(final RequestContext context)方法。

参数RequestContext是流程的容器。


        
    

doExecute方法先设置cookiePath为 /cas/ (默认为 / )。

再在 context.getFlowScope()里面保存:ticketGrantingTicketId,warnCookieValue,service

context.getFlowScope().put(
            "ticketGrantingTicketId", this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request));
        context.getFlowScope().put(
            "warnCookieValue",
            Boolean.valueOf(this.warnCookieGenerator.retrieveCookieValue(request)));

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

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



其中ticketGrantingTicketCookieGenerator,warnCookieGenerator,argumentExtractors由Spring注入,在ticketGrantingTicketCookieGenerator.xml,warnCookieGenerator.xml和argumentExtractorsConfiguration.xml文件中注册。

this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request)取出名字为CASTGC的cookie的值,由于还没有登陆,所以获得null。

Boolean.valueOf(this.warnCookieGenerator.retrieveCookieValue(request))判断名字为CASTGC的cookie的值是否为"true",由于还没有登陆,所以返回false。

 WebUtils.getService(this.argumentExtractors,context);取出service,不知道是什么,值为null。

进入decision-state节点。这些节点是依次执行的。

先检查flowScope中是否存在TGT

  
  
      
  
因为是null,所有进入gatewayRequestCheck


		
	
很明显,service==null,所以,进入serviceAuthorizationCheck


    
        
        
    
会执行evaluate expression="serviceAuthorizationCheck"的doExecute,这个在cas-servlet.xml中定义。

之后执行gentrateLoginTicket中generateLoginTicketAction的generate方法


        
		
	
在cas-servlet.xml中bean为

该bean生成一个loginTicketId放入flowScope中。

其中loginTicketUniqueIdGenerator在uniqueIdGenerators.xml中定义。

但是这个loginTicketId并不是TGT。

接下来根据

返回一个登录页面。在登录页面上输入账号密码。


        
            
            
        
        
            
        
		
            
        
	
会执行authenticationViaFormAction.doBind()方法。这个方法不知道干嘛的。好像是把request和credentials关联到一起。

然后根据to="realSubmit"执行action-state


        
        
		
		
		
		
		
	    
	    
	    
	    
	    
	

执行authenticationViaFormAction.submit(flowRequestContext, flowScope.credentials, messageContext)方法。

这个方法会先判断flowScope和Request中保存的loginTicketId

final String authoritativeLoginTicket = WebUtils.getLoginTicketFromFlowScope(context);
        final String providedLoginTicket = WebUtils.getLoginTicketFromRequest(context);
        

这2个值必须相同,但是后面并没有再用到这2个值。

而是根据credentials ,生成一个TGT

String CASTGT=this.centralAuthenticationService.createTicketGrantingTicket(credentials);
把TGT放入requestScope中

WebUtils.putTicketGrantingTicketInRequestScope(context,tgt);

之后在login-webflow.xml中根据


        
		
	

执行sendTicketGrantingTicketAction的doExecute方法。该方法应该是把TGT放到response的cookie中。

继续回到login-webflow.xml中


		
	

如果service不为null则返回登录成功页面。否则返回renewRequestCheck。


renewRequestCheck又饶了一圈。





你可能感兴趣的:(cas)