cas原理Word文件下载.docx
《cas原理Word文件下载.docx》由会员分享,可在线阅读,更多相关《cas原理Word文件下载.docx(22页珍藏版)》请在冰点文库上搜索。
<
servlet-name>
cas<
/servlet-name>
servlet-class>
org.jasig.cas.web.init.SafeDispatcherServlet<
/servlet-class>
init-param>
param-name>
publishContext<
/param-name>
param-value>
false<
/param-value>
/init-param>
load-on-startup>
1<
/load-on-startup>
/servlet>
servlet-mapping>
url-pattern>
/login<
/url-pattern>
/servlet-mapping>
...
!
--其他casservletmapping-->
所有映射到cas
servlet上的请求都将经过/WEB-INF/cas-servlet.xml检查确定进入哪个Action,cas-servlet.xml中最重要的两个bean就是handlerMappingB和handlerMappingC
handlerMappingB配置了登陆流程进入的路径映射,而handlerMappingC则配置了其他的流程的路径映射。
/WEB-INF/login-webflow.xml流程配置文件即是在handlerMappingB中通过/login映射进入的。
Webflow依据一个生成的flowExecutionKey来确定一个流程实例走到了哪一步,每次页面流程运转总是需要提交这个flowExecutionKey来告诉webflow它是从流程的哪个位置出发的有了以上理论作为依据,我们在下一节就可以根据自己的需要修改流程,使之支持远程登录了
服务器登陆流程修改目标
修改后的登陆流程活动图如下:
图中橙色为我们修改的流程节点,这里我们增加了一个开始节点remoteLogin和一个结束节点
remoteCallbackView,删除了原有的loginFormView节点、
viewGenericLoginSuccess以及
renew节点(renew节点由于系统无此需求而删除),然后将所有这些节点的转向全部都转向
到remoteCallbackView节点,因为登陆和显示登陆成功信息都应该是客户端完成的
服务器端实现目标
好了,原理到这里已经啰嗦完了,下一节讲如何着手修改CAS服务器端啦
。
修改需要基于几个基本原则:
不影响原有统一登陆界面功能
客户端应尽量保持简单
尽量保证原有功能的完整性和安全性
对于第三点,必须事先说明:
将登陆页面放到客户端本身就是降低了CAS安全性,这意味着作为服务向外发布的CAS服务器中的用户密码有可能由于客户端的不安全性而导致泄露,整个CAS系统成为了一个“水桶形态”,整个CAS体系的安全性将取决于所有客户端中安全性最低的一个。
这也是CAS官方一直不推荐的方式。
服务器端修改
接下来我们讲解服务器端修改的详细过程:
首先,修改/WEB-INF/web.xml,为cas增加一个/remoteLogin的映射:
/remoteLogin<
然后修改cas-servlet.xml文件,增加我们对/remoteLogin映射的处理,需要增加一个新流程:
beanid="
handlerMappingB"
class="
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"
>
propertyname="
mappings"
props>
propkey="
/login"
loginController<
/prop>
/remoteLogin"
remoteController<
/props>
/property>
interceptors"
list>
refbean="
localeChangeInterceptor"
/>
/list>
/bean>
然后在cas-servlet.xml文件中添加我们上面所配置的remoteController的bean:
--增加远程控制者,允许以/remote请求启动remote控制流程-->
remoteLoginController"
class="
org.springframework.webflow.executor.mvc.FlowController"
p:
flowExecutor-ref="
remoteLoginFlowExecutor"
defaultFlowId="
remoteLogin-webflow"
argumentHandler"
bean
org.springframework.webflow.executor.support.RequestParameterFlowExecutorArgumentHandler"
flowExecutionKeyArgumentName="
lt"
flow:
executorid="
registry-ref="
remoteLoginFlowRegistry"
execution-attributes>
alwaysRedirectOnPausevalue="
false"
/>
/flow:
executor>
registryid="
locationpath="
/WEB-INF/remoteLogin-webflow.xml"
registry>
可以看到上面将请求指向了webflow配置文件/WEB-INF/remoteLogin-webflow.xml文件,我们需要创建此文件并配置其成为我们所需的流程,以下是remoteLogin-webflow.xml全文:
?
xmlversion="
1.0"
encoding="
UTF-8"
flowxmlns="
http:
//www.springframework.org/schema/webflow"
xmlns:
xsi="
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
http:
//www.springframework.org/schema/webflow
//www.springframework.org/schema/webflow/spring-webflow-1.0.xsd"
start-stateidref="
remoteLogin"
--远程登陆主要Action-->
action-stateid="
actionbean="
remoteLoginAction"
transitionon="
error"
to="
remoteCallbackView"
submit"
bindAndValidate"
checkTicketGrantingTicket"
ticketGrantingTicketExistsCheck"
/action-state>
--远程回调页面,主要以JavaScript的方式回传一些参数用-->
end-stateid="
view="
decision-stateid="
iftest="
${flowScope.ticketGrantingTicketId!
=null}"
then="
hasServiceCheck"
else="
gatewayRequestCheck"
/decision-state>
${externalContext.requestParameterMap['
gateway'
]!
='
'
&
amp;
&
externalContext.requestParameterMap['
=null&
flowScope.service!
=
null}"
redirect"
else="
${flowScope.service!
generateServiceTicket"
--
The"
warn"
actionmakesthedeterminationofwhethertoredirectdirectlytothe
requested
serviceordisplaythe"
confirmation"
pagetogobacktotheserver.
-->
${flowScope.warnCookieValue}"
showWarningView"
authenticationViaFormAction"
success"
method="
sendTicketGrantingTicket"
sendTicketGrantingTicketAction"
serviceCheck"
generateServiceTicketAction"
to="
gateway"
endstateistheendstateforwhentheuserhasrequested
privacysettings(tobe"
warned"
)tobeturnedon.
Itdelegatestoa
viewdefinesindefault_views.propertiesthatdisplaythe"
Pleaseclickheretogo
totheservice."
message.
casLoginConfirmView"
endstateallowsCAStoproperlyendtheworkflowwhilestill
redirecting
theuserbacktotheservicerequired.
bean:
dynamicRedirectViewSelector"
viewServiceErrorView"
viewServiceSsoErrorView"
global-transitions>
transitionto="
on-
exception="
org.springframework.webflow.execution.repository.NoSuchFlowExecutionException"
/
org.jasig.cas.services.UnauthorizedSsoServiceException"
org.jasig.cas.services.UnauthorizedServiceException"
/global-transitions>
/flow>
以上文件根据原login-webflow.xml文件修改,黄色背景为修改部分。
可以看到,我们在流程中增加了remoteLoginAction节点和remoteCallbackView节点,下面我们配置remoteLogin节点:
在/WEB-INF/cas-servlet.xml文件中增加remoteLoginAction配置:
com.baidu.cas.web.flow.RemoteLoginAction"
argumentExtractors-ref="
argumentExtractors"
warnCookieGenerator-ref="
warnCookieGenerator"
ticketGrantingTicketCookieGenerator-ref="
ticketGrantingTicketCookieGenerator"
同时创建com.baidu.cas.web.flow.RemoteLoginAction类:
/**
*远程登陆票据提供Action.
*根据InitialFlowSetupAction修改.
*由于InitialFlowSetupAction为final类,因此只能将代码复制过来再进行修改.
*
*@authorGuoLin
*/
publicclassRemoteLoginActionextendsAbstractAction{
/**CookieGeneratorfortheWarnings.*/
@NotNull
privateCookieRetrievingCookieGeneratorwarnCookieGenerator;
/**CookieGeneratorfortheTicketGrantingTickets.*/
privateCookieRetrievingCookieGeneratorticketGrantingTicketCookieGenerator;
/**Extractorsforfindingtheservice.*/
@NotEmpty
privateList<
ArgumentExtractor>
argumentExtractors;
/**Booleantonotewhetherwe'
vesetthevaluesonthegeneratorsornot.*/
privatebooleanpathPopulated=false;
protectedEventdoExecute(finalRequestContextcontext)throwsException{
finalHttpServletRequestrequest=WebUtils.getHttpServletRequest(context);
if(!
this.pathPopulated){
finalStringcontextPath=context.getExternalContext().getContextPath();
finalStringcookiePath=StringUtils.hasText(contextPath)?
contextPath:
"
/"
;