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

驗(yàn)證碼配置

1.添加驗(yàn)證碼插件

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

2.配置web.xml

<!-- 配置驗(yàn)證碼插件servlet類 -->
<servlet>
    <servlet-name>Kaptcha</servlet-name>
    <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
    <!-- 驗(yàn)證碼邊框 -->
    <init-param>
        <param-name>kaptcha.border</param-name>
        <param-value>no</param-value>
    </init-param>
    <!-- 驗(yàn)證碼字體顏色 -->
    <init-param>
        <param-name>kaptcha.textproducer.font.color</param-name>
        <param-value>red</param-value>
    </init-param>
    <!-- 驗(yàn)證碼圖片的長(zhǎng)度
    <init-param>
        <param-name>kaptcha.image.width</param-name>
        <param-value>135</param-value>
    </init-param> -->
    <!-- 驗(yàn)證碼字符串范圍
    <init-param>
        <param-name>kaptcha.textproducer.char.string</param-name>
        <param-value>ACDEFHKPRSTWX345679</param-value>
    </init-param> -->
    <!-- 驗(yàn)證碼圖片高度
    <init-param>
        <param-name>kaptcha.image.height</param-name>
        <param-value>50</param-value>
    </init-param> -->
    <!-- 驗(yàn)證碼字體大小
    <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>
    <!-- 驗(yàn)證碼字符串個(gè)數(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>
<!-- 獲取驗(yàn)證碼的URL -->
<servlet-mapping>
    <servlet-name>Kaptcha</servlet-name>
    <url-pattern>/captcha.jpg</url-pattern>
</servlet-mapping>

3.頁(yè)面配置

<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>

前面三步配置好后周蹭,頁(yè)面就可以顯示出驗(yàn)證碼了笨枯。

4.頁(yè)面提示語(yǔ)

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

接下來(lái)配置自定義驗(yàn)證

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

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="自定義的實(shí)體類路徑"/>

修改登錄流程

<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"/>
        <!--添加驗(yàn)證碼-->
        <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>

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

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

同時(shí)修改下面代碼:

<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.添加判斷驗(yàn)證碼是否正確的action

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

    //添加自定義驗(yàn)證方法
    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中獲取生成的驗(yàn)證碼
            String vCode = (String) session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
            session.removeAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);

            //獲取前臺(tái)輸入的內(nèi)容
            UsernamePasswordVCodeCredential upvc = (UsernamePasswordVCodeCredential) credential;
            String submitVCode = upvc.getvCode();
            MessageBuilder msgBuilder = new MessageBuilder();
            //驗(yàn)證驗(yàn)證碼是否正確
            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 很多配置都基于注解嫉鲸,所以在自定義類的過(guò)程中如果使用到注解价说,需要到Spring配置文件中設(shè)置自動(dòng)掃描假颇,否則無(wú)法進(jìn)行加載胚鸯。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市笨鸡,隨后出現(xiàn)的幾起案子姜钳,更是在濱河造成了極大的恐慌,老刑警劉巖形耗,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哥桥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡激涤,警方通過(guò)查閱死者的電腦和手機(jī)拟糕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人已卸,你說(shuō)我怎么就攤上這事佛玄。” “怎么了累澡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵梦抢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我愧哟,道長(zhǎng)奥吩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任蕊梧,我火速辦了婚禮霞赫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肥矢。我一直安慰自己端衰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布甘改。 她就那樣靜靜地躺著旅东,像睡著了一般。 火紅的嫁衣襯著肌膚如雪十艾。 梳的紋絲不亂的頭發(fā)上抵代,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音忘嫉,去河邊找鬼荤牍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛庆冕,可吹牛的內(nèi)容都是我干的康吵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼访递,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼涎才!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起力九,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤耍铜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后跌前,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體棕兼,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年抵乓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伴挚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靶衍。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖茎芋,靈堂內(nèi)的尸體忽然破棺而出颅眶,到底是詐尸還是另有隱情,我是刑警寧澤田弥,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布涛酗,位于F島的核電站,受9級(jí)特大地震影響偷厦,放射性物質(zhì)發(fā)生泄漏商叹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一只泼、第九天 我趴在偏房一處隱蔽的房頂上張望剖笙。 院中可真熱鬧,春花似錦请唱、人聲如沸弥咪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)聚至。三九已至,卻和暖如春孽惰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸥印。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工勋功, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人库说。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓狂鞋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親潜的。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骚揍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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

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