因最近公司要用到cas登陆而且要使用自定登陆页面,网络上搜索了一下cas自定义登陆,比较好的两篇文章CAS 之自定义登录页实践和CAS 之 跨域 Ajax 登录实践,感觉写的不错,但是发现改动的地方很多。而且有些说的不是很详细。但是思路可以借鉴一下。
研究了cas整个登陆流程发现只要获取 lt 登录令牌时改变跳转方向就行,
所以修改login-webflow.xml文件
<action-state id="generateLoginTicket">
<evaluate expression="generateLoginTicketAction.generate(flowRequestContext)" />
<transition on="generated" to="viewLoginForm" />
</action-state>
添加一个转跳条件
<action-state id="generateLoginTicket">
<evaluate expression="generateLoginTicketAction.generate(flowRequestContext)" />
<transition on="generated" to="viewLoginForm" />
<transition on="generatedTicket" to="viewTicketAjax" />
</action-state>
添加view视图
<view-state id="viewTicketAjax" view="casTicketViewAjax" model="credential">
<binder>
<binding property="username" />
<binding property="password" />
</binder>
<on-entry>
<set name="viewScope.commandName" value="'credential'" />
</on-entry>
<transition on="submit" bind="true" validate="true" to="validateCaptcha">
<evaluate expression="authenticationViaCaptchaFormAction.doBind(flowRequestContext, flowScope.credential)" />
</transition>
</view-state>
最后,再定义一下 view 的页面地址吧,修改 default_views.properties,添加:
casTicketViewAjax.(class)=org.springframework.web.servlet.view.JstlView
casTicketViewAjax.url=/WEB-INF/view/jsp/custom/ui/ajaxTicket.jsp
jsp代码如下
<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
var _loginTicket='${loginTicket}';
var _flowExecutionKey='${flowExecutionKey}';
通过generateLoginTicketAction在cas-servlet.xml这个找到了
<bean id="generateLoginTicketAction" class="org.jasig.cas.web.flow.GenerateLoginTicketAction"
p:ticketIdGenerator-ref="loginTicketUniqueIdGenerator"/>
修改类GenerateLoginTicketAction里的generate方法,修改为如下
public final String generate(final RequestContext context) {
final String loginTicket = this.ticketIdGenerator.getNewTicketId(PREFIX);
String ticlet = context.getRequestParameters().get("ticket");
logger.debug("Generated login ticket {}", loginTicket);
WebUtils.putLoginTicket(context, loginTicket);
if(ticlet!=null&&ticlet.equals("nbrc")){
return "generatedTicket";
}
return "generated";
}
用于提交数据的form表单格式:
<form id="qiyeForm" οnsubmit="return bus_loginForm();" method="post" data-nbrc="from" >
<input type="hidden" name="lt" data-nbrc="J_LoginTicket"/>
<input type="hidden" name="_eventId" value="submit" />
<input type="hidden" name="execution" data-nbrc="J_Execution" />
<!--用户名-->
<input type="text" name="username" />
!--密码-->
<input type="password" name="password"/>
<!--验证码-->
<input type="text" name="captcha" />
</form>
添加在js添加如下这个
var flushLoginTicket = function(){
var _services = 'service=' + encodeURIComponent('${localService}/j_spring_cas_security_check');
var _cas_services = '${casService}/login';
var cas_url=_cas_services+'?'+_services;
$('[data-nbrc="from" ]').attr("action",cas_url)
$.getScript(cas_url+'&ticket=nbrc&n='+ new Date().getTime(),
function(){
// 将返回的 _loginTicket 变量设置到 input name="lt" 的value中。
$('[data-nbrc="J_LoginTicket"]').val(_loginTicket);
$('[data-nbrc="J_Execution"]').val(_flowExecutionKey);
});
说明:
${localService} 为cas.auth.server=cas项目url地址
${casService}为 cas.local.server=为自己项目url地址
效果就不放出来了,本人已经在生产环境中使用过了
蛋疼的csdn编辑器