`
binghejinjun
  • 浏览: 35685 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

单点登录加验证码例子

阅读更多
     在部署cas登录过程中,可能会用到验证码功能,这里简要介绍一下加入验证码的过程.
1.   首先,我用的cas版本是3.4.6,验证码采用的是CAPTCHA,所需jar包可以google搜索,部署好cas后.在web-info目录下找到login-webflow.xml,打开,找到如下代码:
     <view-state id="viewLoginForm" view="casLoginView" model="credentials">
        <var name="credentials" class="org.jasig.cas.authentication.principal.UsernamePasswordCredentials" />
        <binder>
            <binding property="username" />
            <binding property="password" />
        </binder>
        <on-entry>
            <set name="viewScope.commandName" value="'credentials'" />
        </on-entry>
<transition on="submit" bind="true" validate="true" to="realSubmit">
            <set name="flowScope.credentials" value="credentials" />
            <evaluate expression="authenticationViaFormAction.doBind(flowRequestContext, flowScope.credentials)" />
        </transition>
</view-state>
此段代码的功能是绑定cas登录过程中的用户名和密码,再次我们修改如下:
      <view-state id="viewLoginForm" view="casLoginView" model="credentials">
        <var name="credentials" class="org.jasig.cas.authentication.principal.UsernamePasswordCredentials" />
        <binder>
            <binding property="username" />
            <binding property="password" />
        </binder>
        <on-entry>
            <set name="viewScope.commandName" value="'credentials'" />
        </on-entry>
<transition on="submit" bind="true" validate="true" to="yzmSubmit">
            <set name="flowScope.credentials" value="credentials" />
            <evaluate expression="authenticationViaFormAction.doBind(flowRequestContext, flowScope.credentials)" />
        </transition>
</view-state>
也就是说,只需要修改realSubmit为yzmSubmit即可.然后加入如下配置:
      <!--fan add start-->
<action-state id="yzmSubmit">
        <evaluate expression="yzmViaFormAction.submit(flowRequestContext)" />
<transition on="success" to="realSubmit" />
<transition on="error" to="viewLoginForm" />
</action-state>
<!--fan add end-->
此段配置是自定义的验证码验证器,用来验证你提交的验证码的正确性.
  2.在web-info下找到cas-servlet.xml,打开后,加入
<!--fan add start-->
<bean id="yzmViaFormAction" class="com.ivan.zhang.servlet.YzmAction"
/>
<!--fan add end-->此配置是注册自定义的验证码
  3.编写如下类:
package com.ivan.zhang.servlet;

import com.ivan.zhang.CaptchaServiceSingleton;
import com.octo.captcha.service.image.ImageCaptchaService;
import java.io.PrintStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.jasig.cas.web.support.WebUtils;
import org.springframework.webflow.core.collection.ParameterMap;
import org.springframework.webflow.execution.RequestContext;

public class YzmAction
{
  public final String submit(RequestContext context)
    throws Exception
  {
    Boolean flag = Boolean.valueOf(false);
    System.out.println("YzmAction is submiting....................");
    String yzm = context.getRequestParameters().get("yzm");
    String captchaId = WebUtils.getHttpServletRequest(context).getSession().getId();
    flag = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId,
      yzm);
    if (flag.booleanValue()) {
      return "success";
    }
    return "error";
  }
}
其中,flag = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId,
      yzm);
此句话是为了验证提交的验证码和先前生成的验证码的正确性,以此作为验证结果跳转的依据.CaptchaServiceSingleton此类是自定义类,稍后会附加完整的类供下载调试.
4.打开web-info/view/jsp/default/ui/casLoginView.jsp,在密码下面加入<%--fan add start --%>
<img alt="yzm" src="captcha.jpg">
<spring:message code="screen.welcome.label.yzm.accesskey" var="yzmAccessKey" />
<form:input cssClass="required" cssErrorClass="error" id="yzm" size="25" tabindex="1" accesskey="${yzmAccessKey}" path="yzm" autocomplete="false" htmlEscape="true" />
<%--fan add end --%>
5. 最后一步则是注册验证码生成器,打开web.xml文件,加入
<servlet> 
        <servlet-name>jcaptcha</servlet-name> 
        <servlet-class>com.ivan.zhang.servlet.ImageCaptchaServlet</servlet-class> 
        <load-on-startup>0</load-on-startup> 
    </servlet>
<servlet-mapping> 
        <servlet-name>jcaptcha</servlet-name> 
        <url-pattern>/captcha.jpg</url-pattern> 
    </servlet-mapping>
ok,就这么简单.简单解释一下流程,web.xml中注册的类是用来调用自定义的验证码生成器,以便在显示登陆界面的时候绘制验证码图片,并在session中生成标志位并记录,当用户提交验证码和用户名密码时,会先走自定义的验证码验证器(此时会先验证验证码的正确性),如果正确,再走用户名和密码的验证,如果不正确,则直接跳转回登陆页面.yzm.jar是自定义的验证码生成器和验证类,直接打包好后放到web-info/lib下.
如有疑问,请留言
  
  • yzm.jar (440 KB)
  • 下载次数: 500
分享到:
评论
11 楼 cfying 2016-12-20  
<form:form>表单里的》<form:input>与login-webflow.xml所配置对应的实体类的属性没有一一对应上,所以才报这个错误。
10 楼 农家书虫 2015-04-21  
这么久了,不知道群主那个包还在不?能不能把源码发一份给我参看下,小弟在此感激不尽呀......(971925427@qq.com)
9 楼 YY008871 2013-04-25  
楼下这个类怎么替换啊?都没有找到这个类
8 楼 youmonan 2012-06-20  
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
* UsernamePasswordCredentials respresents the username and password that a user
* may provide in order to prove the authenticity of who they say they are.
*
* @author Scott Battaglia
* @version $Revision: 1.2 $ $Date: 2007/01/22 20:35:26 $
* @since 3.0
* <p>
* This is a published and supported CAS Server 3 API.
* </p>
*/
public class UsernamePasswordCredentials implements Credentials {

    /** Unique ID for serialization. */
    private static final long serialVersionUID = -8343864967200862794L;

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

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

    public String getYzm() {
return yzm;
}

public void setYzm(String yzm) {
this.yzm = yzm;
}

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

    /**
     * @param password The password to set.
     */
    public final void setPassword(final String password) {
        this.password = password;
    }

    /**
     * @return Returns the userName.
     */
    public final String getUsername() {
        return this.username;
    }

    /**
     * @param userName The userName to set.
     */
    public final void setUsername(final String userName) {
        this.username = userName;
    }

    public String toString() {
        return "[username: " + this.username + "]";
    }

    @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 (yzm != null ? !yzm.equals(that.yzm) : that.yzm != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = username != null ? username.hashCode() : 0;
        result = 31 * result + (password != null ? password.hashCode() : 0);
        return result;
    }
}
//将这个类替换
7 楼 youmonan 2012-06-19  
二楼怎么解决的啊
6 楼 youmonan 2012-06-19  
一楼怎么解决的啊
5 楼 youmonan 2012-06-19  
javax.servlet.jsp.JspTagException: No message found under code 'screen.welcome.label.yzm.accesskey' for locale 'zh_CN'

这个怎么解决啊!求帮助。
4 楼 xqhong110 2012-03-16  
ognl.NoSuchPropertyException: org.jasig.cas.authentication.principal.UsernamePasswordCredentials.yzm

报这个错!
3 楼 binghejinjun 2011-11-22  
恩,你暂时把<spring:message code="screen.welcome.label.yzm.accesskey" var="yzmAccessKey" />
去掉
2 楼 qq361961 2011-11-15  
1楼的错误解决了.
在cas 服务端 messages.properties 加入相关配置.

但之后又报错
ERROR [org.springframework.web.servlet.tags.form.InputTag] - <Property not found>
org.springframework.binding.expression.PropertyNotFoundException: Property not found

严重: Servlet.service() for servlet jsp threw exception
ognl.NoSuchPropertyException: org.jasig.cas.authentication.principal.UsernamePasswordCredentials.yzm

1 楼 qq361961 2011-11-15  
报错
javax.servlet.jsp.JspTagException: No message found under code 'screen.welcome.label.yzm.accesskey' for locale 'zh_CN'.

相关推荐

    登录 单点登录 带验证码登录

    在这个"登录 单点登录 带验证码登录"的实例中,我们将会深入探讨以下几个关键知识点: 1. **登录机制**:登录系统通常需要用户输入用户名和密码。在本示例中,登录过程可能是通过用户界面提交表单,后台Java代码...

    go-sso:基于Golang实现的单点登录系统(go-sso),实现手机号注册,手机号+验证码登录,手机号+密码登录,账号登出等功能,用户认证采用cookie和jwt两种方式

    golang单点登录系统(go-sso) 这是一个基于Go语言开发的单点登录系统,实现手机号注册,手机号+验证码登录,手机号+密码登录,账号登出等功能,用户认证采用cookie和jwt两种方式。方法已提供,仅需根据短信通道提供...

    CAS单点登录示例

    CAS(Central Authentication Service,中央认证服务)是一种广泛使用的开源单点登录(Single Sign-On, SSO)协议。SSO允许用户通过一次登录就能访问多个应用系统,而无需为每个系统分别进行身份验证。这种机制提高...

    验证码识别.zip易语言项目例子源码下载

    验证码识别通常涉及以下几个关键技术点: 1. 图像预处理:首先,验证码图片需要经过一系列预处理步骤,如灰度化、二值化、噪声消除等,以简化图像并突出文字部分。在易语言中,可以利用图像处理库或自定义算法来...

    简单的验证码识别代码

    在这个简单的例子中,可能使用了模板匹配,即预先存储各种字符的标准图像,然后与处理后的验证码图像中的字符进行比较,找出最匹配的模板。 5. **错误纠正**:如果识别出错,还可以引入错误纠正机制,如使用N-gram...

    java简单图形验证码识别样例

    值得注意的是,尽管这个例子是简化的,实际的验证码识别可能会更复杂,涉及到深度学习和更复杂的图像处理技术,以应对更复杂的验证码设计。同时,为了增强安全性,开发者通常会不断更新验证码设计,使自动识别变得...

    验证码识别程序.zip易语言项目例子源码下载

    在这个易语言项目例子中,我们看到的是一个使用易语言编写的验证码识别程序源码,这对于初学者、学生以及小型开发团队来说,是一个很好的学习和实践资源。 易语言是一种基于中文的编程语言,它的设计目标是降低编程...

    易语言qifan验证码识别.zip易语言项目例子源码下载

    验证码(CAPTCHA)是一种防止自动程序进行恶意操作的技术,通常用于网站登录、注册、评论等场景,通过让用户输入图片中显示的扭曲文字或数字来验证其为真实的人。验证码识别项目则是为了模拟人类识别验证码的过程,...

    VB验证码识别

    验证码是一种常见的网络安全措施,用于防止自动机器人或恶意软件进行非法操作,例如注册、登录或者发送垃圾邮件。它通常由随机生成的字母、数字或符号组成,用户需要手动输入显示的验证码以证明自己是真实的人。 在...

    验证码识别易语言例程源码.zip易语言项目例子源码下载

    在这个项目中,我们可以学习到以下几个关键知识点: 1. 图像处理:验证码通常以图像形式呈现,因此识别验证码需要对图像进行处理。这包括图像的灰度化、二值化、噪声消除等预处理步骤,以便更好地提取出文字特征。 ...

    易语言天联验证码识别源码.zip易语言项目例子源码下载

    在这个易语言项目中,可能包括以下关键点: 1. 图像处理:首先,源码可能包含了读取和预处理验证码图片的模块。这可能包括灰度化、二值化、噪声去除、倾斜校正等步骤,目的是将复杂的彩色验证码图片转换为更易于...

    vue3-captcha(vue3行为验证码)

    在Vue3-Captcha的实现中,我们可以看到以下关键知识点: 1. **Composition API**:Vue3引入了Composition API,允许开发者将逻辑拆分成可重用的功能块,而不是局限于单个组件的选项对象中。这使得代码更加模块化,...

    网站注册验证码的识别(VC++源代码)

    以及噪声去除,通过滤波器消除图像中的不规则像素点。 2. 图像分割:图像分割是识别过程的关键部分,它旨在将图像中的每个字符分离出来。可以采用连通组件分析或边缘检测算法来实现。在这个VC++例子中,可能会使用...

    Tess4J-验证码解析-实例代码

    通过这个例子,你可以理解如何使用Tess4J库在Java环境中解析验证码,以及解决可能出现的依赖问题。实际应用中,根据验证码的具体格式和复杂程度,可能需要调整识别参数或进行额外的图像预处理,以提高识别准确率。

    e语言-验证码取相连点算法易语言

    本压缩包中的“验证码取相连点算法易语言源码”提供了一个使用易语言实现的验证码字符分割方法,主要涉及图像处理和算法设计。 验证码取相连点算法是一种图像分析技术,它的目的是将验证码图像中的各个字符分离出来...

    简单验证码识别示例(高手pass)

    在提供的例子中,验证码图片来源于"http://www.pvpgame.com.cn/authimg.php",这是一个实际的网址,但请注意,实际操作时应遵守相关法律法规,不得侵犯他人隐私和网站安全。 验证码识别涉及的技术主要包括以下几个...

    验证码识别事例

    验证码识别是一种重要的信息安全技术,主要用于防止自动化程序(如机器人或爬虫)进行恶意操作,如批量注册、频繁登录等。本示例中的“验证码识别”着重于如何通过算法实现对图像验证码的解析。 验证码通常由一串...

    e语言-易语言凹凸圈数字验证码识别

    在这个例子中,可能会用到GDI+(图形设备接口加)或者OpenCV等图像处理库的相关API,例如获取图像像素、滤波、边缘检测等,以提取验证码中的数字特征。 验证码识别通常涉及以下几个步骤: 1. 预处理:包括灰度化、...

    PHP生成验证码

    在这个PHP验证码生成的例子中,我们将深入探讨如何创建一个简单的验证码系统。 首先,验证码的生成过程通常包括以下几个步骤: 1. **随机字符串生成**:验证码的核心是随机生成的一串字符,通常包含字母、数字或...

Global site tag (gtag.js) - Google Analytics