CAS SSO 4.0 增加验证码

        这一篇主要是讲解怎么在登录页上添加验证码功能,默认的登录页是只有用户名与密码功能。其他我觉得加验证码没什么用,因为现在我部门做的系统主要是放在内网里,外网是不能访问的。登录页的验证码主要是为了防止进账号进行暴力破解,不过我觉得客户估计也不会没事去搞这玩意。以上只是我自己的个人见解,可能有失偏颇,就当作是对客户的愤怒的一种发泄吧,大家看看就好,最近真是被客户搞得头都大了。不过,如果你的系统放在外网上,那验证码是必须要加上的 。  好了,牢骚发的差不多了,下面进入正题吧!


1.打开 login-webflow.xml 文件,大家可能会觉得有点熟悉 。对的,cas有使用Spring Web Flow框架。 找到下面代码:

<view-state id="viewLoginForm" view="casLoginView" 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="realSubmit">
		<evaluate expression="authenticationViaFormAction.doBind(flowRequestContext, flowScope.credential)" />
	</transition>
</view-state>
大家看到没,这边有一个form (viewLoginForm),里面有username、password两个属性,没错,这就是对应我们登录页面上的表单。所以我们要在这边加上验证码这个属性。

<binder>
	<binding property="username" />
	<binding property="password" />
	 <!-- 新添加 -->
	<binding property="captcha" />
</binder> 


2.我们只在这边添加一个属性后,够吗?当然不够,因为这个配置实际上有在代码中对应一个java类 UsernamePasswordCredential.java,具体路径为 org.jasig.cas.authentication.UsernamePasswordCredential.java ,查看源码看看,实际上就是一个javabean而已。那么我们就可以继承它,然后加上我们的captcha 属性!完成后的代码如下:

public class UsernamePasswordCaptchaCredential extends UsernamePasswordCredential {

    private static final long serialVersionUID = -864735145551932618L;
 
	@NotNull
    @Size(min=1,message = "required.captcha")
    private String captcha;
    
    //省略set、get方法
}


3.好了,新的javabean诞生了。够了吗?实际还有一个地方要修改,回到 login-webflow.xml 文件,第27行左右,修改如下:

<!-- 修改后前 -->
<var name="credential" class="org.jasig.cas.authentication.UsernamePasswordCredential" />

<!-- 修改后 -->
<!--  <var name="credential" class="org.jasig.cas.authentication.UsernamePasswordCredential" /> -->

<var name="credential" class="org.jasig.cas.authentication.UsernamePasswordCaptchaCredential" />


4.好了,接下来要添加校验验证码的流程了,还是刚才viewLoginForm 那里,我们把它修改成下面:

<!-- 修改前 -->
<view-state id="viewLoginForm" view="casLoginView" model="credential">
	<binder>
		<binding property="username" />
		<binding property="password" />
		<binding property="captcha" />
	</binder>
	<on-entry>
		<set name="viewScope.commandName" value="'credential'" />
	</on-entry>
	<transition on="submit" bind="true" validate="true" to="realSubmit">
		<evaluate expression="authenticationViaFormAction.doBind(flowRequestContext, flowScope.credential)" />
	</transition>
</view-state>


--------------------------------我是分割线-----------------------------
<!-- 修改后 -->
<view-state id="viewLoginForm" view="casLoginView" model="credential">
	<binder>
		<binding property="username" />
		<binding property="password" />
		<binding property="captcha" />
	</binder>
	<on-entry>
		<set name="viewScope.commandName" value="'credential'" />
	</on-entry>
	<transition on="submit" bind="true" validate="true" to="validatorCaptcha">
		<evaluate expression="authenticationViaFormAction.doBind(flowRequestContext, flowScope.credential)" />
	</transition>
</view-state>
<!-- 添加一个 validatorCaptcha 校验验证码的操作 -->
<action-state id="validatorCaptcha">
	<evaluate expression="authenticationViaFormAction.validatorCaptcha(flowRequestContext, flowScope.credential, messageContext)"></evaluate>
	<transition on="error" to="generateLoginTicket" />
	<transition on="success" to="realSubmit" />
</action-state>
我们在配置中添加了一个 validatorCaptcha 的操作,同时可以看到 expression 是 authenticationViaFormAction.validatorCaptcha(...)
所以我们需要在  authenticationViaFormAction 中添加一个校验验证码的方法 validatorCaptcha()。authenticationViaFormAction 这个bean是配置在 cas-servlet.xml 中的: 

<bean id="authenticationViaFormAction" class="org.jasig.cas.web.flow.AuthenticationViaFormAction"
	p:centralAuthenticationService-ref="centralAuthenticationService"
	p:warnCookieGenerator-ref="warnCookieGenerator"
	p:ticketRegistry-ref="ticketRegistry"/>

我们可以看看 org.jasig.cas.web.flow.AuthenticationViaFormAction 的源代码,里面有一个 submit 方法,这个就是我们提交表单时的方法了。
我们也重写下吧,大概修改成下面的:

public class CnBlogAuthenticationViaFormAction extends AuthenticationViaFormAction{

    public final String validatorCaptcha(final RequestContext context, final Credential credential,
		final MessageContext messageContext){
	
		final HttpServletRequest request = WebUtils.getHttpServletRequest(context);  
		HttpSession session = request.getSession();  
		String captcha = (String)session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);  
		session.removeAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);  
		
		UsernamePasswordCaptchaCredential upc = (UsernamePasswordCaptchaCredential)credential;  
		String submitAuthcodeCaptcha =upc.getCaptcha(); 
		
		
		if(!StringUtils.hasText(submitAuthcodeCaptcha) || !StringUtils.hasText(submitAuthcodeCaptcha)){
			messageContext.addMessage(new MessageBuilder().code("required.captcha").build()); 
			return "error";    
		}  
		if(submitAuthcodeCaptcha.equals(captcha)){    
			return "success";  
		}  
		messageContext.addMessage(new MessageBuilder().code("error.authentication.captcha.bad").build());
		return "error";    
    }
}

这边有抛出两个异常,这两个异常信息 required.captcha、error.authentication.captcha.bad 需要在 messages.properties 文件下添加:

required.captcha=必须输入验证码。
error.authentication.captcha.bad=您输入的验证码有误。

然后把 authenticationViaFormAction 这个Bean路径修改为我们新添加的链接,这个就不贴了,大家照上面改就行了修改over!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值