CAS添加验证码功能

1.  cas.war 下面的web-inf/web.xml  lib添加  kaptcha.jar

  kaptcha.jar通过maven获取

 <dependency>
    <groupId>com.github.axet</groupId>
    <artifactId>kaptcha</artifactId>
    <version>0.0.9</version>
 </dependency>

这个maven 包含两个 jar 另一个是filters-2.0.235.jar

2. cas.war 下面的web-inf/web.xml添加验证码映射

<servlet>
        <servlet-name>Kaptcha</servlet-name>
        <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
        <init-param>
            <param-name>kaptcha.border</param-name>
            <param-value>no</param-value>
        </init-param>
        <init-param>
            <param-name>kaptcha.textproducer.char.space</param-name>
            <param-value>5</param-value>
        </init-param>
        <init-param>
            <param-name>kaptcha.textproducer.char.length</param-name>
            <param-value>5</param-value>
        </init-param>
    </servlet>  

    <servlet-mapping>
        <servlet-name>Kaptcha</servlet-name>
        <url-pattern>/captcha.jpg</url-pattern>
</servlet-mapping>  

3. cas中 UsernamePasswordCredentials 类增加验证码属性 authcode

/** The authcode. */
   @NotNull
   @Size(min=1, message = "required.authcode")
   private String authcode;  

public String getAuthcode() {
    return authcode;
}  

public void setAuthcode(String authcode) {
    this.authcode = authcode;
}  

/**
    * @return Returns the password.
    */
   public final String getPassword() {
       return this.password;
   }  

并且重写equals和hashCode方法

@Override
   public boolean equals(final Object o) {
       if (this == o) return true;
       if (o == null || getClass() != o.getClass()) return false;  

       UsernamePasswordCredentials that = (UsernamePasswordCredentials) o;  

       if (password != null ? !password.equals(that.password) : that.password != null) return false;
       if (username != null ? !username.equals(that.username) : that.username != null) return false;
       if (authcode != null ? !authcode.equals(that.authcode) : that.authcode != null) return false;
       return true;
   }  

   @Override
   public int hashCode() {
       int result = username != null ? username.hashCode() : 0;
       result = 31 * result + (password != null ? password.hashCode() : 0);
       result = 31 * result + (authcode != null ? authcode.hashCode() : 0);
       return result;
   }  

4. AuthenticationViaFormAction 类增加验证方法

public final String validatorCode(final RequestContext context,  final Credentials credentials, final MessageContext messageContext) throws Exception {
        final HttpServletRequest request = WebUtils.getHttpServletRequest(context);
        HttpSession session = request.getSession();
        String authcode = (String)session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
        session.removeAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);  

        UsernamePasswordCredentials upc = (UsernamePasswordCredentials)credentials;
        String submitAuthcode =upc.getAuthcode();
        if(!StringUtils.hasText(submitAuthcode) || !StringUtils.hasText(authcode)){
            populateErrorsInstance(new NullAuthcodeAuthenticationException(),messageContext);
            return "error";
        }
        if(submitAuthcode.equals(authcode)){
            return "success";
        }
        populateErrorsInstance(new BadAuthcodeAuthenticationException(),messageContext);
        return "error";
    }  

NullAuthcodeAuthenticationException 、BadAuthcodeAuthenticationException为定义的异常类,取得异常编码

/*
 * Licensed to Jasig under one or more contributor license
 * agreements. See the NOTICE file distributed with this work
 * for additional information regarding copyright ownership.
 * Jasig licenses this file to you under the Apache License,
 * Version 2.0 (the "License"); you may not use this file
 * except in compliance with the License.  You may obtain a
 * copy of the License at the following location:
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.jasig.cas.authentication.handler;  

import org.jasig.cas.ticket.TicketException;  

/**
 * The exception to throw when we know the authcode is null
 *
 * @author Scott Battaglia
 * @version $Revision$ $Date$
 * @since 3.0
 */
public class NullAuthcodeAuthenticationException extends TicketException {  

    /** Serializable ID for unique id. */
    private static final long serialVersionUID = 5501212207531289993L;  

    /** Code description. */
    public static final String CODE = "required.authcode";  

    /**
     * Constructs a TicketCreationException with the default exception code.
     */
    public NullAuthcodeAuthenticationException() {
        super(CODE);
    }  

    /**
     * Constructs a TicketCreationException with the default exception code and
     * the original exception that was thrown.
     *
     * @param throwable the chained exception
     */
    public NullAuthcodeAuthenticationException(final Throwable throwable) {
        super(CODE, throwable);
    }}  
/*
 * Licensed to Jasig under one or more contributor license
 * agreements. See the NOTICE file distributed with this work
 * for additional information regarding copyright ownership.
 * Jasig licenses this file to you under the Apache License,
 * Version 2.0 (the "License"); you may not use this file
 * except in compliance with the License.  You may obtain a
 * copy of the License at the following location:
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.jasig.cas.authentication.handler;  

import org.jasig.cas.ticket.TicketException;  

/**
 * The exception to throw when we know the authcoe is not correct
 *
 * @author Scott Battaglia
 * @version $Revision$ $Date$
 * @since 3.0
 */
public class BadAuthcodeAuthenticationException extends TicketException {  

    /** Serializable ID for unique id. */
    private static final long serialVersionUID = 5501212207531289993L;  

    /** Code description. */
    public static final String CODE = "error.authentication.authcode.bad";  

    /**
     * Constructs a TicketCreationException with the default exception code.
     */
    public BadAuthcodeAuthenticationException() {
        super(CODE);
    }  

    /**
     * Constructs a TicketCreationException with the default exception code and
     * the original exception that was thrown.
     *
     * @param throwable the chained exception
     */
    public BadAuthcodeAuthenticationException(final Throwable throwable) {
        super(CODE, throwable);
    }}  

5. login_webflow.xml 修改登录验证流程

<view-state id="viewLoginForm" view="casLoginView" model="credentials">
        <binder>
            <binding property="username" />
            <binding property="password" />
            <binding property="authcode" />
        </binder>
        <on-entry>
            <set name="viewScope.commandName" value="‘credentials‘" />
        </on-entry>
        <transition on="submit" bind="true" validate="true" to="authcodeValidate">
            <evaluate expression="authenticationViaFormAction.doBind(flowRequestContext, flowScope.credentials)" />
        </transition>
    </view-state>  

    <action-state id="authcodeValidate">
        <evaluate expression="authenticationViaFormAction.validatorCode(flowRequestContext, flowScope.credentials, messageContext)" />
        <transition on="error" to="generateLoginTicket" />
        <transition on="success" to="realSubmit" />
    </action-state> 

6. 增加国际化显示信息

messages_zh_CN.properties文件中添加,其他国家语言类似添加

screen.welcome.label.authcode=\u9A8C\u8BC1\u7801:
screen.welcome.label.authcode.accesskey=a
required.authcode=\u5FC5\u987B\u5F55\u5165\u9A8C\u8BC1\u7801\u3002
error.authentication.authcode.bad=\u9A8C\u8BC1\u7801\u8F93\u5165\u6709\u8BEF\u3002  

7. 登录页面casLoginView.jsp添加验证码输入框

<div class="row fl-controls-left">
                      <label for="authcode"><spring:message code="screen.welcome.label.authcode" /></label>
                      <spring:message code="screen.welcome.label.authcode.accesskey" var="authcodeAccessKey" />
                        <table>
                        <tr>
                                <td>
                        <form:input cssClass="required" cssErrorClass="error" id="authcode" size="10" tabindex="2" path="authcode"  accesskey="${authcodeAccessKey}" htmlEscape="true" autocomplete="off" />
                        </td>
                                <td align="left" valign="bottom" style="vertical-align: bottom;">
                          <img alt="<spring:message code="required.authcode" />" onclick="this.src=‘captcha.jpg?‘+Math.random()" width="93" height="30" src="captcha.jpg">
                    </td>
                        </tr>
                        </table>
                    </div>
                    <div class="row check">
                        <input id="warn" name="warn" value="true" tabindex="3" accesskey="<spring:message code="screen.welcome.label.warn.accesskey" />" type="checkbox" />
                        <label for="warn"><spring:message code="screen.welcome.label.warn" /></label>
                    </div> 

以上操作有些要修改源码,所以还是要把源码下载下来部署到Eclipse上修改比较方便,修改后编译成class文件放入到cas web里面

CAS添加验证码功能

时间: 2024-08-24 08:52:23

CAS添加验证码功能的相关文章

为 jumpserver跳板机 添加 验证码 功能

Jumpserver-VerificationCode 介绍 项目地址:Jumpserver-VerificationCode 本项目为jumpserver添加了企业微信验证码功能 使用方法 3个脚本放置与jumpserver根目录 修改 /etc/passwd 中的init.sh修改为NewInit.sh 效果图 原文地址:http://blog.51cto.com/2860664/2091667

64.django实现登录添加验证码功能

1.目的 现在我们一般访问网页都需要输入验证码,比如博客园,有的甚至是通过手机验证码实时登录.这样做的目的主要还是为了防止其他人的恶意访问,比如爬虫,下面就来看看验证码是如何实现的 2.演示 这里我在项目下创建了一个utils文件,存放验证码文件,字体文件下载猛戳这里 utils/code.py import random from PIL import Image,ImageDraw,ImageFont,ImageFilter def check_code(width=120, height=

使用JS来实现验证码功能

最近想为自己的Django博客添加验证码功能,本来想使用第三方库来实现的,不过考虑到添加第三方库对性能的影响,以及第三方库是否安全可靠的问题,还是用自己的代码来实现吧.反正用JS来实现验证码功能又不是很难. 简单来说,用一个create_code()方法在页面中生成验证码,然后control_submit()方法检测验证码文本框(id="user_input_code")的键盘输入事件,当文本框输入了超过4个字符后,调用verify_code ()检测输入的字符与生成的验证码是否一致,

cas4.2.4 登添加验证码

看了很多添加验证码的博文,唯独没有4.24的 重点看第3条,其余的和别人博文大致相同 1.首先在cas工程的web.xml增加验证码功能的支持 <!-- 验证码功能 -->      <servlet>          <servlet-name>Kaptcha</servlet-name>          <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</se

【试水CAS-4.0.3】第03节_CAS服务端登录页添加验证码

/** * @see ------------------------------------------------------------------------------------------------------------------------ * @see CAS登录页添加验证码 * @see 0.这年头验证码一般用来防止帐号被暴力破解,如果我们的系统是走专线的,也就是说放在内网,那完全没必要搞验证码 * @see 1.由于CAS使用了Spring Web Flow框架,所以

前后端分离之后添加验证码

转载自:http://www.cnblogs.com/liminjun88/p/6556493.html#commentform 1.背景介绍 团队开发的项目,前端基于Bootstrap+AngularJS,后端Spring MVC以RESTful接口给前端调用.开发和部署都是前后端分离.项目简单部署图如下,因为后台同时采用微服务的方式,所以后台不止3个,画图示意.终极方案是采用Docker,在前端和后台调用中间添加一层:API Gateway. 因为考虑到和其他系统集成的可能性,所以在登录这一

自己实现一个验证码功能

用Servlet技术实现验证码功能,(画出一个验证码) 公司中一般用写好的验证码(jar包),很少使用自己去画验证码 . package chensi.com; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import j

thinkphp验证码功能

Think\Verify类可以支持验证码的生成和验证功能. 为了显示这个验证码功能,第一要有控制器,再就是有方法,然后是显示的页面. 一.最简单的方式生成验证码 (1)我们还是继续在那个控制器编写方法 这个方法显示这个验证码的页面 public function xianshi() { $this->show(); } public function shengcheng() { //造验证码的对象 $v = new \Think\Verify(); //生成验证码 $v->entry();

跟陈湾来完善C++(2), 添加属性功能

上面几篇文章中,我们添加了名称空间优化,添加事件功能.这些对我来说其实已经够了.但还可以加一个属性功能. 当我们在C++中更改一个属性时,平常都是Get函数加上Set函数,但是这样,没有直接写一个成员变量方便.例如: a.SetValue(a.GetValue() + 1); 没有 a.Value = a.Value + 1; 方便. 但是这种方便只有在调用有属性功能的对象时才能使用.在创建属性的时候我还是用老套路,写一个Get和Set函数,该干啥还是干啥.我的属性功能其实就是在类中添加一个共有