cas自定義驗證碼功能(4.2.7)

驗證碼配置

1.添加驗證碼插件

<!-- google captcha 生成驗證碼 -->
<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>

2.配置web.xml

<!-- 配置驗證碼插件servlet類 -->
<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.font.color</param-name>
        <param-value>red</param-value>
    </init-param>
    <!-- 驗證碼圖片的長度
    <init-param>
        <param-name>kaptcha.image.width</param-name>
        <param-value>135</param-value>
    </init-param> -->
    <!-- 驗證碼字符串范圍
    <init-param>
        <param-name>kaptcha.textproducer.char.string</param-name>
        <param-value>ACDEFHKPRSTWX345679</param-value>
    </init-param> -->
    <!-- 驗證碼圖片高度
    <init-param>
        <param-name>kaptcha.image.height</param-name>
        <param-value>50</param-value>
    </init-param> -->
    <!-- 驗證碼字體大小
    <init-param>
        <param-name>kaptcha.textproducer.font.size</param-name>
        <param-value>43</param-value>
    </init-param> -->
    <!-- 干擾線 顏色 -->
    <init-param>
        <param-name>kaptcha.noise.color</param-name>
        <param-value>black</param-value>
    </init-param>
    <!-- 驗證碼字符串個數(shù) -->
    <init-param>
        <param-name>kaptcha.textproducer.char.length</param-name>
        <param-value>5</param-value>
    </init-param>
    <!-- 字體樣式
    <init-param>
        <param-name>kaptcha.textproducer.font.names</param-name>
        <param-value>Arial</param-value>
    </init-param>-->
</servlet>
<!-- 獲取驗證碼的URL -->
<servlet-mapping>
    <servlet-name>Kaptcha</servlet-name>
    <url-pattern>/captcha.jpg</url-pattern>
</servlet-mapping>

3.頁面配置

<section class="row">
  <label for="vCode"><spring:message code="screen.welcome.label.vCode" /></label>
  <spring:message code="screen.welcome.label.vCode.accesskey" var="vCodeAccessKey" />
  <form:input cssClass="required" cssErrorClass="error" id="vCode" size="10" tabindex="2" path="vCode"  accesskey="${vCodeAccessKey}" htmlEscape="true" autocomplete="off" />
  <img alt="<spring:message code="required.vCode" />" onclick="changeVerifyCode(this)" width="93" height="32" src="captcha.jpg">
</section>

前面三步配置好后,頁面就可以顯示出驗證碼了。

4.頁面提示語

screen.welcome.label.vCode=\u9A8C\u8BC1\u7801:  
screen.welcome.label.vCode.accesskey=a
screen.welcome.label.authSourceType=\u7528\u6237\u7c7b\u578b:
screen.welcome.label.authSourceType.accesskey=a
required.vCode=\u9a8c\u8bc1\u7801\u4e0d\u80fd\u4e3a\u7a7a\u3002
error.authentication.vCode.bad=\u9a8c\u8bc1\u7801\u6709\u8bef\u3002

接下來配置自定義驗證

1.先創(chuàng)建自定義的接收登錄驗證實體類

public class UsernamePasswordVCodeCredential extends UsernamePasswordCredential {

    @NotNull
    @Size(
            min=1,
            message = "required.vCode"
    )
    private String vCode;


    public String getvCode() {
        return vCode;
    }

    public void setvCode(String vCode) {
        this.vCode = vCode;
    }

}

2.修改login-webflow.xml文件

<var name="credential" class="org.jasig.cas.authentication.UsernamePasswordCredential"/>

替換為

<var name="credential" class="自定義的實體類路徑"/>

修改登錄流程

<view-state id="viewLoginForm" view="casLoginView" model="credential">
    <binder>
        <binding property="username" required="true"/>
        <binding property="password" required="true"/>
        
    </binder>
    <on-entry>
        <set name="viewScope.commandName" value="'credential'"/>

        <!--
        <evaluate expression="samlMetadataUIParserAction" />
        -->
    </on-entry>
    <transition on="submit" bind="true" validate="true" to="realSubmit"/>
</view-state>

修改為:

<view-state id="viewLoginForm" view="casLoginView" model="credential">
    <binder>
        <binding property="username" required="true"/>
        <binding property="password" required="true"/>
        <!--添加驗證碼-->
        <binding property="vCode" required="true"/>
        
    </binder>
    <on-entry>
        <set name="viewScope.commandName" value="'credential'"/>

        <!--
        <evaluate expression="samlMetadataUIParserAction" />
        -->
    </on-entry>
    <!--<transition on="submit" bind="true" validate="true" to="realSubmit"/>-->
    <!-- 修改登錄流程 -->
    <transition on="submit" bind="true" validate="true" to="vCodeValidate"/>
</view-state>

在上面這段代碼的下面添加這段代碼

<!-- 判斷驗證碼是否正確 -->
<action-state id="vCodeValidate">
    <evaluate expression="authenticationViaFormVCodeAction.validatorCode(flowRequestContext, flowScope.credential, messageContext)" />
    <transition on="error" to="initializeLogin" />
    <transition on="success" to="realSubmit" />
</action-state>

同時修改下面代碼:

<action-state id="realSubmit">
  <evaluate
        expression="authenticationViaFormAction.submit(flowRequestContext, flowScope.credential, messageContext)"/>
  <transition on="warn" to="warn"/>
  <!--
  To enable AUP workflows, replace the 'success' transition with the following:
  <transition on="success" to="acceptableUsagePolicyCheck" />
  -->
  <transition on="success" to="sendTicketGrantingTicket"/>
  <transition on="successWithWarnings" to="showMessages"/>
  <transition on="authenticationFailure" to="handleAuthenticationFailure"/>
  <transition on="error" to="initializeLogin"/>
</action-state>

修改為

<action-state id="realSubmit">
  <evaluate
        expression="authenticationViaFormVCodeAction.submit(flowRequestContext, flowScope.credential, messageContext)"/>
  <transition on="warn" to="warn"/>
  <!--
  To enable AUP workflows, replace the 'success' transition with the following:
  <transition on="success" to="acceptableUsagePolicyCheck" />
  -->
  <transition on="success" to="sendTicketGrantingTicket"/>
  <transition on="successWithWarnings" to="showMessages"/>
  <transition on="authenticationFailure" to="handleAuthenticationFailure"/>
  <transition on="error" to="initializeLogin"/>
</action-state>

3.添加判斷驗證碼是否正確的action

@Component("authenticationViaFormVCodeAction")
public class AuthenticationViaFormVCodeAction extends AuthenticationViaFormAction{

    //添加自定義驗證方法
    public final String validatorCode(final RequestContext context, final Credential credential, final MessageContext messageContext) throws Exception {
        final HttpServletRequest request = WebUtils.getHttpServletRequest(context);
        HttpSession session = request.getSession();

        String o = request.getParameter("useVCode");
        boolean useVCode = o == null ? true : Boolean.valueOf(o);

        if (useVCode) {
            //在session中獲取生成的驗證碼
            String vCode = (String) session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
            session.removeAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);

            //獲取前臺輸入的內(nèi)容
            UsernamePasswordVCodeCredential upvc = (UsernamePasswordVCodeCredential) credential;
            String submitVCode = upvc.getvCode();
            MessageBuilder msgBuilder = new MessageBuilder();
            //驗證驗證碼是否正確
            if (!StringUtils.hasText(submitVCode) || !StringUtils.hasText(vCode)) {
                msgBuilder.code("required.vCode");
                messageContext.addMessage(msgBuilder.error().build());
                return "error";
            }
            if (submitVCode.equalsIgnoreCase(vCode)) {
                return "success";
            }
            msgBuilder.code("error.authentication.vCode.bad");
            messageContext.addMessage(msgBuilder.error().build());
            return "error";
        } else {
            return "success";
        }
    }

}

注意:由于cas 2.7.x 很多配置都基于注解,所以在自定義類的過程中如果使用到注解,需要到Spring配置文件中設(shè)置自動掃描,否則無法進行加載。

參考文章:
http://blog.csdn.net/bitree1/article/details/55050545

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,752評論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,828評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,922評論 6 342
  • 一切照常接上小花貓回家,路上小花貓問愛上一個需要多長時間。貓爸爸十分驚訝,但還是故作鎮(zhèn)定自若。如果是大人的話就要...
    海廣閱讀 217評論 0 0
  • 現(xiàn)場互娛是現(xiàn)場娛樂領(lǐng)域的航班管家/飛常準(zhǔn),定位于現(xiàn)場娛樂領(lǐng)域的票務(wù)服務(wù)。獲取更多演出信息,就到現(xiàn)場互娛,現(xiàn)場互娛,...
    現(xiàn)場互娛閱讀 569評論 0 0