浏览 6511 次
锁定老帖子 主题:CAS增加登录验证码
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-08-30
CAS版本:cas-server-3.4.11,cas-client-3.2.1 1、当然是在登录页面(casLoginView.jsp)增加验证码的输入框(这里我命名为:vcode)。 2、增加vcode输入框后,那相应的,在接收表单的java bean里面也要加上vcode属性,CAS接收和验证登录表单的java bean是UsernamePasswordCredentials,这里我是增加了一个自己的UsernamePasswordVCodeCredentials的类,当然这里要继承UsernamePasswordCredentials类; public class UsernamePasswordVCodeCredentials extends UsernamePasswordCredentials { private static final long serialVersionUID = 1L; private String firstname; @NotNull @Size(min=1,message = "required.vcode")/*这里需要到相应的属性文件里面增加描述*/ private String vcode; public String getVcode() { return vcode; } public void setVcode(String vcode) { this.vcode = vcode; } public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } } 更改login-webflow.xml配置 将: <var name="credentials" class="org.jasig.cas.authentication.principal.UsernamePasswordCredentials" />> 换成 <var name="credentials" class="net.bean.UsernamePasswordVCodeCredentials" /> 然后需要增加对vcode的校验方法了,这里我也是增加一个类,就叫MyAuthenticationViaFormAction public class MyAuthenticationViaFormAction extends AuthenticationViaFormAction { private final String ERROR="error"; private final String SUCCESS="success"; public final String validatorCode(final RequestContext context, final Credentials credentials, final MessageContext messageContext) throws Exception { String vcode=(String)WebUtils.getHttpServletRequest(context).getSession().getAttribute("vcode"); UsernamePasswordVCodeCredentials upv=(UsernamePasswordVCodeCredentials)credentials; if(StringUtils.isBlank(upv.getVcode()) || StringUtils.isBlank(vcode)) return ERROR; if(upv.getVcode().equals(vcode)){ return SUCCESS; } MessageBuilder msgBuilder=new MessageBuilder(); msgBuilder.defaultText("验证码有误!"); messageContext.addMessage(msgBuilder.error().build()); return ERROR; } } 那加了校验类之后,当然配置也得改了,在cas-servlet.xml里面找到 <bean id="authenticationViaFormAction" class="org.jasig.cas.web.flow.AuthenticationViaFormAction" p:centralAuthenticationService-ref="centralAuthenticationService" p:warnCookieGenerator-ref="warnCookieGenerator"/> 改成 <bean id="authenticationViaFormAction" class="net.validator.MyAuthenticationViaFormAction" p:centralAuthenticationService-ref="centralAuthenticationService" p:warnCookieGenerator-ref="warnCookieGenerator" /> 然后在login-webflow.xml里面找到id="viewLoginForm"这个位置,将这个view-state换成; <view-state id="viewLoginForm" view="casLoginView" model="credentials"> <binder> <binding property="username" /> <binding property="password" /> <binding property="vcode" /> </binder> <on-entry> <set name="viewScope.commandName" value="'credentials'" /> </on-entry> <transition on="submit" bind="true" validate="true" to="validatorCode"> <evaluate expression="authenticationViaFormAction.doBind(flowRequestContext, flowScope.credentials)" /> </transition> </view-state> <action-state id="validatorCode"> <evaluate expression="authenticationViaFormAction.validatorCode(flowRequestContext, flowScope.credentials, messageContext)" /> <transition on="error" to="generateLoginTicket" /> <transition on="success" to="realSubmit" /> </action-state> ........... 到这里就配置完成了(发现spring webflow还挺有意思的............) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-08-31
好东西,我最近也在搞 cas 还没提要加验证码,先准备着。
|
|
返回顶楼 | |
发表时间:2012-08-31
这两天真好做了这个事情,实现思路一直,但是没有去改他的webflow文件,个人觉得楼主这个比较好,个人觉得在cas的这个设计里面在后面的验证过程 屏蔽掉了Servlet的request这些web api 有点不怎么好搞,有时候在验证中需要从session中或者其他地方获取信息 这个还比较麻烦
|
|
返回顶楼 | |
发表时间:2013-08-11
楼主,你都没有讲验证码是怎么生成的,难道加了个表单就自己会有验证码了吗
|
|
返回顶楼 | |