修改让cas支持客户端自定义登陆页面----服务器篇-

正在登陆游戏服务器  时间:2021-01-10  阅读:()

 让CAS支持客户端自定义登陆页面——服务器篇- [De velopment]

2009-03-23

声明 时请以超形式标明文章原始出处和作者信息及本声明fallenlord.blogbus./logs/36907044.html

上篇《让CAS支持客户端自定义登陆页面——原理篇》讲述了一些修改的理论基础这篇讲解如何对C AS服务器端进行修改。

修改需要基于几个基本原则

1 . 不影响原有统一登陆界面功能

2. 客户端应尽量保持简单

3. 尽量保证原有功能的完整性和安全性

对于第三点 必须事先说明将登陆页面放到客户端本身就是降低了 CAS安全性这意味着作为服务向外发布的CAS服务器中的用户密码有可能由于客户端的不安全性而导致泄露整个CAS系统成为了一个“水桶形态”整个CAS体系的安全性将取决于所有客户端中安全性最低的一个。这也是CAS官方一直不推荐的方式。

接下来我们讲解服务器端修改的详细过程

首先修改/WEB-IN F/web.xml  为cas增加一个/remoteLogin的映射

<servl et-mappi ng>

<servlet-n ame>c as</s ervlet-n ame>

<url-pattern>/remoteLogin</url-pattern>

</servl et-mapping>

然后修改cas-servlet.xml文件 增加我们对/remoteLogin映射的处理 需要增加一个新流程<bean id="handlerMappingB" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMappi ng ">

<property name="mappings">

<props>

<prop key="/login">loginControl ler</prop>

<prop key="/remoteLogin">remoteControl ler</prop>

</props>

</property>

<property name="interceptors">

<l ist>

<ref bean="localeChangeInterceptor" />

</list>

</property>

</b ea n>

然后在cas-servlet.xml文件中添加我们上面所配置的remoteController的bean

<!--增加远程控制者 允许以/remote请求启动remote控制流程-->

<bean id="remoteLoginControl ler"class="org.springframework.webflow.executor.mvc.FlowController"p:flowExecutor-ref="remoteLoginFlowExecutor"p:defaultFlowId="remoteLogin-webflow">

<property name="argumentHandl er">

<bean class="org.springframework.webflow.executor.support.RequestParameterFlowExecutorArgumentHandler"p:flowExecutionKeyArgu mentName="lt"

p:defaultFlowId="remoteLogin-webflow" />

</property>

</b ea n>

<flow:executor id="remoteLoginFlowExecutor" registry-ref="remoteLoginFlowRegistry">

<flow:execution-attributes>

<flow:alwaysRedirectOnPause value="false"/>

</flow:execution-attributes>

</flow:executor>

<flow:registry id="remoteLoginFlowRegistry">

<flow:location path="/WEB-INF/remoteLogin-webflow.xml"/>

</flow:registry>

可以看到上面将请求指向了webflow配置文件/WEB-IN F/remoteLogin-webflow.xml文件 我们需要创建此文件并配置其成为我们所需的流程 以下是remoteLogin-webflow.xml全文

<?xml version="1 .0" encoding="UTF-8"?>

<flow xmlns=".springframework.org/schema/webflow"xmlns:xsi=".w3.org/2001/XMLSchema-instance"xsi :schemaLocation="

.springframework.org/schema/webflow

.springframework.org/schema/webflow/spring-webflow-1 .0.xsd">

<start-state idref="remoteLogin"/>

<!--远程登陆主要Action -->

<action-state id="remoteLogin">

<action bean="remoteLoginAction" />

<transition on="error" to="remoteCal lbackView" />

<transition on="submit" to="bindAndValidate" />

<transition on="checkTicketGrantingTicket" to="ticketGrantingTicketExistsCheck" />

</action-state>

<!--远程回调页面 主要以JavaScript的方式回传一些参数用 -->

<end-state id="remoteCal lbackView" view="remoteCallbackView" />

<decision-state id="ticketGrantingTicketExistsCheck">

<if test="${flowScope.ticketGrantingTicketId != nul l}" then="hasServiceCheck"else="gat ewayRequ estCh eck" />

</decision-state>

<decision-state id="gatewayRequestCheck">

<if test="${external Context.requestParameterMap['gateway'] != ''&amp;&amp; externalContext.re questParameterMap['gateway'] != null&amp;&amp; flowScope.service != nul l}" then="redirect" else="re moteCal lbackView" />

</decision-state>

<decision-state id="hasServiceCheck">

<if test="${flowScope.service != nul l}" then="generateServiceTicket" else="remoteCal lbackView"/>

</decision-state>

<!--

The "warn" action makes the determination of whether to redirect directly to the requested service or display the "confirmation" page to go back to the server.

-->

<decision-state id="warn">

<if test="${flowScope.warnCookieValue}" then="showWarningView" else="redirect" /></decision-state>

<action-state id="bindAndVal idate">

<action bean="authenticationViaFormAction" />

<transition on="success" to="submit" />

<transition on="error" to="remoteCal lbackView" />

</action-state>

<action-state id="submit">

<action bean="authenticationViaFormAction"method="submit" />

<transition on="warn" to="warn" />

<transition on="success" to="sendTicketGrantingTicket" />

<transition on="error" to="remoteCal lbackView" />

</action-state>

<action-state id="sendTicketGrantingTicket">

<action bean="sendTicketGrantingTicketAction" />

<transition on="success" to="serviceCheck" />

</action-state>

<decision-state id="serviceCheck">

<if test="${flowScope.service != nul l}" then="generateServiceTicket"else="remoteCal lbackView" />

</decision-state>

<action-state id="generateServiceTicket">

<action bean="generateServiceTicketAction" />

<transition on="success" to ="warn" />

<transition on="error" to="remoteCal lbackView" />

<transition on="gateway" to="redirect" />

</action-state>

<!--

The "showWarningView" end state is the end state for when the user has requested privacy settings (to be "warned") to be turned on. It delegates to a view defines in default_views.properties that display the "Please cl ick here to go to the service."message.

-->

<end-state id="showWarningView" view="casLoginConfirmView" />

<!--

The "redirect" end state al lows CAS to properly end the workflow whi le sti l l redirecting the user back to the service required.

-->

<end-state id="redirect" view="bean:dynamicRedirectViewSelector" />

<end-state id="viewServiceErrorView" view="viewServiceErrorView" />

<end-state id="viewServiceSsoErrorView" view="viewServiceSsoErrorView" />

<global-transitions>

<transition to="viewServiceErrorView" on-exception="org.springframework.webflow.execution.repository.NoSuchFlowExecuti onException" />

<transition to="viewServiceSsoErrorView" on-

exception="org.jasig.cas.services.UnauthorizedSsoServiceException" />

<transition to="viewServiceErrorView" on-exception="org.jasig.cas.services.UnauthorizedServiceException" />

</global-transitions>

</flow>

以上文件根据原login-webflow.xml文件修改黄色背景为修改部分。可以看到我们在流程中增加了 r emoteLogin Action节点和remoteCallback View节点 下面我们配置remoteLogin节点

在/WEB-IN F/cas-servlet.xml文件中增加remoteLoginAction配置

<bean id="remoteLoginAction"class=".baidu.cas.web.flow.RemoteLoginAction"p:argu mentExtractors-ref="argumentExtractors"p:warnCookieGenerator-ref="warnCookieGenerator"p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator" />

同时创建com.baidu.cas.web.flow.RemoteLoginAction类

*

*远程登陆票据提供Action.

*根据InitialFlowSetupAction修改.

* 由于InitialFlowSetupAction为final类 因此只能将代码复制过来再进行修改.

*

* author GuoLin

*/publ ic class RemoteLoginAction extends AbstractAction {

/** CookieGenerator for the Warnings. */

NotNul l

private CookieRetrievingCookieGenerator warnCookieGenerator;

/** CookieGenerator for the TicketGrantingTickets. */

NotNul l private CookieRetrievingCookieGenerator ticketGrantingTicketCookieGenerator;/** Extractors for finding the service. */

NotEmpty private List<ArgumentExtractor> argumentExtractors;

/** Boolean to note whether we've set the values on the generators or not. */private boolean pathPopulated = false;protected Event doExecute(final RequestContext context) throws Exception {final HttpServletRequest request =WebUti ls.getHttpServletRequest(context);if (!this.pathPo pul ated) {final String contextPath = context.getExternal Context().getContextPath() ;final String cookiePath = StringUti ls.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 =WebUti ls.getService(this.argumentExtractors, context);if (service != nul l &&logger.isDebugEnabled()) {logger.debug("Placing service in FlowScope: " + service.getId());

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

//客户端必须传递loginUrl参数过来否则无法确定登陆目标页面if (StringUti ls.hasText(request.getParameter("loginUrl"))) {context.getFlowScope().put("remoteLoginUrl", request.getParameter("loginUrl"));

} else {request.setAttribute("remoteLoginMessage", "loginUrl parameter must be supported.") ;return error();

}

//若参数包含submit则进行提交否则进行验证if (StringUti ls.hasText(request.getParameter("submit"))) {return result("submit");

} else {return result("checkTicketGrantingTicket");

}

}publ ic void setTicketGrantingTicketCookieGenerator(final CookieRetrievingCookieGenerator ticketGrantingTicketCookieGenerator) {this.ticketGrantingTicketCookieGenerator = ticketGrantingTicketCookieGenerator;

}publ ic void setWarnCookieGenerator(final CookieRetrievingCookieGenerator warnCookieGenerator) {this.warnCookieGenerator =warnCookieGenerator;

}publ ic void setArgumentExtractors(

2021HawkHost老鹰主机黑色星期五虚拟主机低至3.5折 永久4.5折

老鹰主机HawkHost是个人比较喜欢的海外主机商,如果没有记错的话,大约2012年左右的时候算是比较早提供支付宝付款的主机商。当然这个主机商成立时间更早一些的,由于早期提供支付宝付款后,所以受众用户比较青睐,要知道我们早期购买海外主机是比较麻烦的,信用卡和PAYPAL还没有普及,大家可能只有银联和支付宝,很多人选择海外主机还需要代购。虽然如今很多人建站少了,而且大部分人都用云服务器。但是老鹰主机...

HostKvm($4.25/月),俄罗斯CN2带宽大升级,俄罗斯/香港高防限量5折优惠进行中

HostKvm是一家成立于2013年的国外VPS服务商,产品基于KVM架构,数据中心包括日本、新加坡、韩国、美国、俄罗斯、中国香港等多个地区机房,均为国内直连或优化线路,延迟较低,适合建站或者远程办公等。本月,商家旗下俄罗斯、新加坡、美国、香港等节点带宽进行了大幅度升级,俄罗斯机房国内电信/联通直连,CN2线路,150Mbps(原来30Mbps)带宽起,目前俄罗斯和香港高防节点5折骨折码继续优惠中...

IonSwitch:$1.75/月KVM-1GB/10G SSD/1TB/爱达荷州

IonSwitch是一家2016年成立的国外VPS主机商,部落上一次分享的信息还停留在2019年,主机商提供基于KVM架构的VPS产品,数据中心之前在美国西雅图,目前是美国爱达荷州科德阿伦(美国西北部,西接华盛顿州和俄勒冈州),为新建的自营数据中心。商家针对新数据中心运行及4号独立日提供了一个5折优惠码,优惠后最低1GB内存套餐每月仅1.75美元起。下面列出部分套餐配置信息。CPU:1core内存...

正在登陆游戏服务器为你推荐
免费云主机求一个免费的云主机?中文域名注册查询哪里有可以查询中文域名是否被注册的地方?ip代理地址ip代理有什么用?域名备案买域名要备案吗虚拟空间哪个好国内哪个空间商(虚拟主机)最好虚拟空间哪个好哪个网络服务商的虚拟空间服务比较好呢?重庆虚拟空间现在重庆那家主机空间最好?虚拟主机管理系统推荐几个适合windows的免费虚拟主机管理系统美国免费虚拟主机哪有便宜的美国虚拟主机?246数据美国虚拟主机一年才40元http://246idc.com/host/沈阳虚拟主机有没有不限空间、不限流量的网站?
美国vps服务器 域名邮箱 vps服务器租用 罗马假日广场 火车票抢票攻略 云主机51web 租空间 免费全能空间 本网站在美国维护 anylink linux空间 me空间社区 lol台服官网 美国免费空间 香港新世界中心 超级服务器 万网主机 ncp是什么 美国服务器 服务器是什么 更多