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

CAS 浅析 - 服务端登录流程简介(二) - login-webflow.xml简介

    博客分类:
  • CAS
CAS 
阅读更多
声明:这只是个人见解,不代表官方。
<on-start>
    <evaluate expression="initialFlowSetupAction" />
</on-start>

首先他的on-start表示流程开始,开始的时候它会到你的cookie中取Ticket信息。当然,如果你没有登录过Ticket信息当然没有。
cas-servlet.xml里面有initialFlowSetupAction的配置。
<bean id="initialFlowSetupAction" class="org.jasig.cas.web.flow.InitialFlowSetupAction"
		p:argumentExtractors-ref="argumentExtractors"
		p:warnCookieGenerator-ref="warnCookieGenerator"
		p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator" />

其中主要的Code如下:
protected Event doExecute(final RequestContext context) throws Exception {
        final HttpServletRequest request = WebUtils.getHttpServletRequest(context);
        if (!this.pathPopulated) {
            final String contextPath = context.getExternalContext().getContextPath();
            final String cookiePath = StringUtils.hasText(contextPath) ? contextPath + "/" : "/";
            logger.info("Setting path for cookies to: "
                + cookiePath);
            this.warnCookieGenerator.setCookiePath(cookiePath);
            this.ticketGrantingTicketCookieGenerator.setCookiePath(cookiePath);
            this.pathPopulated = true;
        }

        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);

        return result("success");
    }

接下是判断用户是否已经登录过(也就是否存在Ticket信息):
<decision-state id="ticketGrantingTicketExistsCheck">
		<if test="flowScope.ticketGrantingTicketId neq null" then="hasServiceCheck" else="gatewayRequestCheck" />
	</decision-state>
    
	<decision-state id="gatewayRequestCheck">
		<if test="externalContext.requestParameterMap['gateway'] neq '' &amp;&amp; externalContext.requestParameterMap['gateway'] neq null &amp;&amp; flowScope.service neq null" then="gatewayServicesManagementCheck" else="generateLoginTicket" />
	</decision-state>
	
	<decision-state id="hasServiceCheck">
		<if test="flowScope.service != null" then="renewRequestCheck" else="viewGenericLoginSuccess" />
	</decision-state>
	
	<decision-state id="renewRequestCheck">
		<if test="externalContext.requestParameterMap['renew'] neq '' &amp;&amp; externalContext.requestParameterMap['renew'] neq null" then="generateLoginTicket" else="generateServiceTicket" />
	</decision-state>

如果存在Ticket则表示已经登录过。
1. 如果已经登录,就进行Ticket验证.
  (1)如果Ticket验证成功就跳转到成功页面.
  (2)如果Ticket验证失败,则重新生成Ticket.
2. 如果未登录,就进行网关验证.
  (1)如果网关验证通过就进生成登录的Ticket.
  (2)如果网关验证失败,则返回异常。

以上有两个分支都会汇到了重新生成Ticket.其它的分支则已经完成。
以下讲解重新生成Ticket之后的流程:
<action-state id="generateLoginTicket">
        <evaluate expression="generateLoginTicketAction.generate(flowRequestContext)" />
		<transition on="generated" to="viewLoginForm" />
	</action-state>
    
	<view-state id="viewLoginForm" view="casLoginView" model="credentials">
        <binder>
            <binding property="username" />
            <binding property="password" />
        </binder>
        <on-entry>
            <set name="viewScope.commandName" value="'credentials'" />
        </on-entry>
		<transition on="submit" bind="true" validate="true" to="realSubmit">
            <evaluate expression="authenticationViaFormAction.doBind(flowRequestContext, flowScope.credentials)" />
        </transition>
        	
	</view-state>
	

	<action-state id="realSubmit">
        <evaluate expression="authenticationViaFormAction.submit(flowRequestContext, flowScope.credentials, messageContext)" />
		<transition on="warn" to="warn" />
		<transition on="success" to="sendTicketGrantingTicket" />
		<transition on="error" to="generateLoginTicket" />
	</action-state>
	
	<action-state id="sendTicketGrantingTicket">
        <evaluate expression="sendTicketGrantingTicketAction" />
		<transition to="serviceCheck" />
	</action-state>

	<decision-state id="serviceCheck">
		<if test="flowScope.service neq null" then="generateServiceTicket" else="viewGenericLoginSuccess" />
	</decision-state>

重新生成新的Ticket之后,就会跳转到登录页面。
输入登录信息之后进行登录验证,验证通过,则回填Ticket,跳转到成功页面。
验证失败则会重新生成新的Ticket.
分享到:
评论

相关推荐

    cas-overlay-template-6.4 服务端代码

    ----------------------------使用--------------------------------- ...14.CAS-实现自定义返回用户登录信息 15.CAS-页面缓存记住我 ------------------------------建表脚本在文件里登录用户/密码:ll/123456

    cas-server-3.4.3.1-release.zip

    总之,"cas-server-3.4.3.1-release.zip"是一个用于与Liferay 6.0.5集成的CAS服务器版本,提供了统一认证的功能,简化了用户的登录流程,提高了系统的安全性。这个压缩包包含了一整套运行和开发CAS服务器所需的所有...

    cas-server-webapp-4.0.0单点登录(带超详细文档、数据连接jar包、c3p0)可运行

    单点登录 sso cas带超详细文档,包含(cas-server-webapp-4.0.0.war、c3p0-0.9.1.2.jar、cas-client-core-3.3.3.jar、cas-server-support-jdbc-4.0.0.jar、cas-server-webapp-support-4.0.0.jar、commons-logging-...

    cas-server-3.4.2.1-release

    "cas-server-3.4.2.1-release" 是一个特定版本的 CAS(Central Authentication Service)服务器软件包。CAS 是一个开源的身份验证框架,主要用于实现单一登录(Single Sign-On, SSO)服务,广泛应用于教育、研究和...

    cas-server-服务端源码.zip

    `cas-server-服务端源码.zip`提供的正是CAS服务端的源代码,特别是老版本4.2.27。 CAS的核心工作流程如下: 1. **认证过程**:当用户尝试访问受CAS保护的应用时,会被重定向到CAS服务器进行身份验证。如果用户尚未...

    cas-server-webapp-tomcat-5.3.16.war

    cas-server-webapp-tomcat-5.3.16.war maven依赖包

    单点登录服务端项目cas-server

    单点登录服务端项目cas-server单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-...

    cas-overlay-template-6.1 服务端代码

    在本文中,我们将深入探讨"cas-overlay-template-6.1 服务端代码",以及如何在部署过程中结合MySQL数据源。 CAS 6.1X 是CAS服务器的一个版本,它提供了许多增强的安全性和功能。"overlay"在这里指的是自定义CAS...

    cas-client-core-3.1.10.jar

    可用 cas-client-core-3.1.10.jar

    cas-client-core-3.2.1.jar

    cas-client-core-3.2.1

    cas-server-jdbc-3.0.5-rc2.jar

    cas-server-jdbc-3.0.5-rc2.jar

    cas-server服务端maven项目

    这是已经调整过的cas服务端,maven项目 已完成内容 登录页面已做调整 ... http://127.0.0.1:8080/cas-server/login?client=client1 参数client=client1表示使用client1方案的数据源和sql查询数据

    cas-server-5.3.14-mysql相关jar包.rar

    cas-server mysql相关jar包(cas-server-support-jdbc-5.3.14.jar、cas-server-support-jdbc-authentication-5.3.14.jar、cas-server-support-jdbc-drivers-5.3.14.jar、mysql-connector-java-5.1.28.jar)

    cas-client-3.1.12-release.zip

    CAS 客户端的安装通常涉及将相关的JAR文件添加到项目的类路径中,并配置相应的服务器端XML配置文件,如 `cas-client-support-spring.xml` 或者 `web.xml`。3.1.12版本可能会提供更简洁的配置选项和更好的兼容性,以...

    cas-client-core-3.3.3.jar

    cas-client-core-3.3.3.jar放到客户端lib文件夹下就ok

    cas-client-core-3.3.3

    CAS(Central Authentication Service)是一种基于Web的单点登录(Single Sign-On, SSO)协议,主要用于简化用户在多个应用系统间的登录流程。`cas-client-core-3.3.3` 是一个CAS客户端的核心库,它使得应用程序能够...

    让CAS支持客户端自定义登陆页面----服务器篇--.doc

    上述配置中指定了`remoteLogin-webflow.xml`文件路径,该文件用于定义自定义登录页面的具体流程。需要创建该文件,并根据需求进行配置。 ```xml &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;flow xmlns=...

    cas-overlay-template-5.3.zip,可以集成springboot,亲测可用。

    总的来说,`cas-overlay-template-5.3.zip`提供了一个方便的起点,让你能够在Spring Boot环境中快速部署和定制CAS 5.3版本的单点登录服务。通过适当的配置和开发,你可以轻松地将CAS集成到你的应用程序中,提高用户...

    Spring主流jar包大全

    cas-client-core-3.2.1.jar cglib-3.1.jar ckfinder-2.3.jar ckfinderplugin-fileeditor-2.3.jar ckfinderplugin-imageresize-2.3.jar classmate-1.1.0.jar commons-beanutils-1.9.1.jar commons-codec-1.9.jar ...

Global site tag (gtag.js) - Google Analytics