`
awaitdeng
  • 浏览: 216559 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

CAS服务端添加验证码

    博客分类:
  • CAS
CAS 
阅读更多


添加jcaptcha.jar文件

web.xml:
增加
<servlet-mapping>
<servlet-name>cas</servlet-name>
<url-pattern>/captcha.htm</url-pattern>
</servlet-mapping>

login_webflow.xml:
   <action-state id="bindAndValidate">
       <action bean="authenticationViaFormAction" />
       <transition on="success" to="submit" />
       <transition on="error" to="viewLoginForm" />
   </action-state>
替换为
    <action-state id="bindAndValidate">
      <action bean="authenticationViaFormAction" />
      <transition on="success" to="captchaValidate" />
      <transition on="error" to="viewLoginForm" />
    </action-state>
增加
   <action-state id="captchaValidate">
       <action bean="captchaValidateAction" />
       <transition on="success" to="submit" />
       <transition on="error" to="viewLoginForm" />
   </action-state>

cas_servlet.xml:
增加
       <prop key="/captcha.htm">captchaImageCreateController</prop>
    <bean id="captchaValidateAction" class="utils.captcha.CaptchaValidateAction"
      p:captchaService-ref="jcaptchaService"
      p:captchaValidationParameter="j_captcha_response"/>

    <bean id="captchaImageCreateController" class="utils.captcha.CaptchaImageCreateController">
      <property name="jcaptchaService" ref="jcaptchaService"/>
    </bean>
    <bean id="fastHashMapCaptchaStore" class="com.octo.captcha.service.captchastore.FastHashMapCaptchaStore" />
<bean id="jcaptchaService" class="com.octo.captcha.service.image.DefaultManageableImageCaptchaService">
        <constructor-arg type="com.octo.captcha.service.captchastore.CaptchaStore" index="0">
            <ref bean="fastHashMapCaptchaStore"/>
        </constructor-arg>
        <constructor-arg type="com.octo.captcha.engine.CaptchaEngine" index="1">
            <bean class="utils.captcha.JCaptchaEngineEx"/>
        </constructor-arg>
        <constructor-arg index="2">
            <value>180</value>
        </constructor-arg>
        <constructor-arg index="3">
            <value>100000</value>
        </constructor-arg>
        <constructor-arg index="4">
            <value>75000</value>
        </constructor-arg>
    </bean>

增加java类:
1、
package utils.captcha;
import com.octo.captcha.service.image.ImageCaptchaService;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.io.ByteArrayOutputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.*;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class CaptchaImageCreateController implements Controller, InitializingBean {
   private ImageCaptchaService jcaptchaService;
   public CaptchaImageCreateController(){
   }
   public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception {
      byte captchaChallengeAsJpeg[] = null;
      ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
      String captchaId = request.getSession().getId();
      java.awt.image.BufferedImage challenge=jcaptchaService.getImageChallengeForID(captchaId,request.getLocale());
      JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);

      jpegEncoder.encode(challenge);
      captchaChallengeAsJpeg = jpegOutputStream.toByteArray();response.setHeader("Cache-Control", "no-store");
      response.setHeader("Pragma", "no-cache");
      response.setDateHeader("Expires", 0L);
      response.setContentType("image/jpeg");
      ServletOutputStream responseOutputStream = response.getOutputStream();
      responseOutputStream.write(captchaChallengeAsJpeg);
      responseOutputStream.flush();
      responseOutputStream.close();
      return null;
   }
   public void setJcaptchaService(ImageCaptchaService jcaptchaService) {
      this.jcaptchaService = jcaptchaService;
   }
   public void afterPropertiesSet() throws Exception {
      if(jcaptchaService == null)
         throw new RuntimeException("Image captcha service wasn`t set!");
      else
         return;
   }
}

2、
package utils.captcha;
import org.jasig.cas.web.support.WebUtils;
import org.springframework.webflow.action.AbstractAction;
import org.springframework.webflow.execution.Event;
import org.springframework.webflow.execution.RequestContext;

import com.octo.captcha.service.CaptchaServiceException;
import com.octo.captcha.service.image.ImageCaptchaService;

public final class CaptchaValidateAction extends AbstractAction {
   private ImageCaptchaService jcaptchaService;
   private String captchaValidationParameter = "_captcha_parameter";
   protected Event doExecute(final RequestContext context) {
      String captcha_response = context.getRequestParameters().get(captchaValidationParameter);
      boolean valid = false;

      if(captcha_response != null){
         String id = WebUtils.getHttpServletRequest(context).getSession().getId();
         if(id != null){
            try {
               valid = jcaptchaService.validateResponseForID(id,captcha_response).booleanValue();
            } catch (CaptchaServiceException cse) {
            }
         }
      }

      if(valid){
         return success();
      }
      return error();
   }

   public void setCaptchaService(ImageCaptchaService captchaService) {
      this.jcaptchaService = captchaService;
   }

   public void setCaptchaValidationParameter(String captchaValidationParameter) {
      this.captchaValidationParameter = captchaValidationParameter;
   }
}

3、
package utils.captcha;
import java.awt.Color;
import java.awt.Font;

import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
import com.octo.captcha.component.image.backgroundgenerator.GradientBackgroundGenerator;
import com.octo.captcha.component.image.color.SingleColorGenerator;
import com.octo.captcha.component.image.fontgenerator.FontGenerator;
import com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster;
import com.octo.captcha.component.image.textpaster.TextPaster;
import com.octo.captcha.component.image.textpaster.textdecorator.BaffleTextDecorator;
import com.octo.captcha.component.image.textpaster.textdecorator.LineTextDecorator;
import com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator;
import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage;
import com.octo.captcha.component.image.wordtoimage.WordToImage;
import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator;
import com.octo.captcha.component.word.wordgenerator.WordGenerator;
import com.octo.captcha.engine.image.ListImageCaptchaEngine;
import com.octo.captcha.image.gimpy.GimpyFactory;

public class JCaptchaEngineEx extends ListImageCaptchaEngine {

    protected void buildInitialFactories() {
        /**
         * Set Captcha Word Length Limitation which should not over 6
         */
        Integer minAcceptedWordLength = new Integer(4);
        Integer maxAcceptedWordLength = new Integer(4);
        /**
         * Set up Captcha Image Size: Height and Width
         */
        Integer imageHeight = new Integer(28);
        Integer imageWidth = new Integer(75);
        /**
         * Set Captcha Font Size between 50 and 55
         */
        final Integer minFontSize = new Integer(22);
        final Integer maxFontSize = new Integer(22);
        /**
         * We just generate digit for captcha source char
         * Although you can use abcdefg......xyz
         */
        WordGenerator wordGenerator = (new RandomWordGenerator("0123456789"));
        /**
         * cyt and unruledboy proved that backgroup not a factor of Security.
         * A captcha attacker won't affaid colorful backgroud, so we just use
         * white color, like google and hotmail.
         */
        Color bgColor = new Color(255, 255, 255);
        BackgroundGenerator backgroundGenerator = new GradientBackgroundGenerator(
                imageWidth, imageHeight, bgColor, bgColor);
        /**
         * font is not helpful for security but it really increase difficultness for attacker
         */
        FontGenerator _fontGenerator = new FontGenerator() {
           public Font getFont() {
               return new Font("Arial", Font.ITALIC, 16);
           }
           public int getMinFontSize() {
               return minFontSize.intValue();
           }
           public int getMaxFontSize() {
               return maxFontSize.intValue();
           }
        };
        /**
         * Note that our captcha color is Blue
         */
        SingleColorGenerator scg = new SingleColorGenerator(Color.BLACK);
        /**
         * decorator is very useful pretend captcha attack.
         * we use two line text decorators.
         */
        LineTextDecorator line_decorator = new LineTextDecorator(new Integer(1), Color.blue);
        LineTextDecorator line_decorator2 = new LineTextDecorator(new Integer(1), Color.blue);
        TextDecorator[] textdecorators = new TextDecorator[2];

        textdecorators[0] = line_decorator;
        textdecorators[1] = line_decorator2;

        TextPaster _textPaster = new DecoratedRandomTextPaster(minAcceptedWordLength,
                maxAcceptedWordLength, scg, new TextDecorator[]{new BaffleTextDecorator(new Integer(0), Color.white)});

        /**
         * ok, generate the WordToImage Object for logon service to use.
         */
        WordToImage wordToImage = new ComposedWordToImage(
               _fontGenerator, backgroundGenerator, _textPaster);
      
        addFactory(new GimpyFactory(wordGenerator, wordToImage));
    }


}

登录的jsp页面:
增加
<img src="captcha.htm" />
<input type="text" id="j_captcha_response" name="j_captcha_response" />

 

要添加 jcaptcha-1.0-all.jar包到项目JAR包库中

分享到:
评论

相关推荐

    CAS-4.0.3服务端登录页添加验证码的Demo

    这是我的博文http://blog.csdn.net/jadyer/article/details/46916169中的完整代码

    springmvc+spring+shiro+cas单点登录实例

    服务端启动就用windows版本的tomcat吧,tomcat添加cas-server就好,端口自定 spring-node-1 和spring-node-1 是cas客户端,这两个直接用maven-tomcat7的插件启动,在pom.xml中配置好了,端口也在配置了。然后clean ...

    cas源码改造

    cas源码改造,添加验证码

    SSO CAS Server 二次开发说明文档

    4. **添加验证码校验逻辑**:在认证处理流程中增加验证码验证步骤。如果用户输入的验证码不正确,则登录失败。 5. **自定义异常处理Handler**:编写自定义的异常处理程序,用于记录错误登录次数并在达到阈值时触发...

    cas 系统实例 服务端配置(一)

    下面是对CAS服务端配置可能涉及的一些关键知识点的详细说明: 1. **CAS服务器安装**:首先,我们需要下载CAS服务器的源代码或者二进制包,并在适当的环境中进行安装。这通常包括解压、构建和运行服务。 2. **环境...

    使用CAS整合CXF实现单点登录部署步骤

    4. **配置Tomcat**:将CAS服务器的war文件放入Tomcat的webapps目录下,并配置Tomcat的`server.xml`,设置SSL监听端口,导入CAS服务端证书。 5. **启动CAS服务器**:启动Tomcat,确认CAS服务器正常运行。 接下来,...

    cas-overlay(MD5 数据用户校验).zip

    在描述中提到的"服务端数据库配置"是指设置CAS服务器以与特定的数据库进行交互,存储和验证用户信息。这通常涉及到以下几个步骤: 1. 配置数据源:在`pom.xml`中添加数据库驱动依赖,并在`cas-server-support-jdbc`...

    CAS 开发综合笔记

    为了增强安全性,可以为CAS服务器添加验证码功能。这通常涉及在登录页面集成验证码生成和验证逻辑,确保只有输入正确验证码的用户才能继续登录流程。文件"为CAS单点登录服务器增加验证码功能 - waitingmyself的日志...

    cas_client.zip CAS认证中心客户端starter

    通常,只需将解压后的文件添加到你的项目依赖中,然后在应用的配置文件(如`application.properties`或`application.yml`)中配置相应的CAS服务器地址和其他参数。 3. **配置文件**:在配置文件中,你需要设置以下...

    cas-client-3.2.1+cas-server-3.4.10

    总结来说,"cas-client-3.2.1+cas-server-3.4.10"是实现网络应用SSO认证的一个解决方案,涉及到了客户端和服务端的配置、安全策略、用户认证流程、单点登出以及系统维护等多个方面。正确配置和使用这个组合,可以极...

    cas单点登录汇总整理.rar

    这通常涉及在服务端代码中添加 CAS 相关配置,如 URL 地址、服务标识等。 3. 配置服务定义:在 CAS 服务器上定义服务,包括服务的唯一标识和服务的回调URL。 4. 用户认证:可以自定义认证机制,例如使用 LDAP、JDBC ...

    CAS服务器部署

    3. **Web服务器**:如Apache Tomcat,用于部署CAS服务端应用。 4. **数据库**:可选,用于存储认证信息,如MySQL、Oracle等。 ### 三、CAS服务器下载与解压 从官方网站或者其他可靠源下载CAS服务器的最新稳定版本,...

    SSO CAS 整理 - 页面备份

    这需要在CAS服务器上配置DUO API,用户在成功通过第一因素认证后,还需要提供第二因素(如手机验证码)才能完全登录。 7. **连接数据库**: CAS服务器可以连接到数据库,如MySQL或Oracle,来存储和验证用户账户...

    java开源包1

    容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...

    java开源包11

    容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...

    java开源包2

    容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...

    java开源包3

    容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...

    java开源包6

    容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...

    java开源包5

    容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...

    java开源包10

    容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展...

Global site tag (gtag.js) - Google Analytics