Coin163

首页 > CAS SSO 4.0.x 增加验证码

CAS SSO 4.0.x 增加验证码

相关标签: cas 验证码 sso

2020腾讯云8月秒杀活动,优惠非常大!(领取2860元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1040

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
入口地址https://www.aliyun.com/minisite/goods

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

1、修改 login-webflow.xml

打开 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、扩展UsernamePasswordCredential类

我们只在这边添加一个属性后,够吗?当然不够,因为这个配置实际上有在代码中对应一个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、修改login-webflow.xml

<!-- 修改后前 -->  
<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>  

5、cas-servlet.xml

我们在配置中添加了一个 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"/>  

6、修改表单提交类

我们可以看看 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";      
    }  
}  

7、修改异常提示

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

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

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

原文

这一篇主要是讲解怎么在登录页上添加验证码功能,默认的登录页是只有用户名与密码功能。其他我觉得加验证码没什么用,因为现在我部门做的系统主要是放在内网里,外网是不能访问的。登录页的验证

------分隔线----------------------------
相关推荐