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);
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
这个方法会先判断flowScope和Request中保存的loginTicketId
final String authoritativeLoginTicket = WebUtils.getLoginTicketFromFlowScope(context);
final String providedLoginTicket = WebUtils.getLoginTicketFromRequest(context);
而是根据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中