CAS 구현 사이트 내 단일 로그인 및 타사 OAuth, OpenId 로그인(2)
1. 로그인 양식
<form:form id="loginForm" method="post" commandName="${commandName}" htmlEscape="true">
    <form:errors path="*" element="em" cssClass="" />
    <c:if test="${not empty sessionScope.openIdLocalId}">
         <input id="username" name="username" type="text" value="${sessionScope.openIdLocalId}" />
    </c:if>
    <c:if test="${empty sessionScope.openIdLocalId}">
        <!--   input,  springframework   form:input  ,  -->
        <form:input id="username" path="username" htmlEscape="true" />
    </c:if>
     :<input id="password" name="password" type="password" />
     :<input id="validateCode" name="validateCode" type="text" /><img src="/captcha.jpg" />
    <input id="rememberMe" name="rememberMe" type="checkbox" value="true" /><label for="rememberMe"> </label>
    <input id="login-Btn" type="button" value=" " />
    <input name="lt" type="hidden" value="${loginTicket}" />
    <input name="execution" type="hidden" value="${flowExecutionKey}" />
    <input name="_eventId" type="hidden" value="submit" />
</form:form>
<!--   jquery.cookie   jquery.md5   -->
<script type="text/javascript">
    $(document).ready(function(){
        var loginUsername = $.cookie("loginUsername");
        if(loginUsername){
            $("#username").val(loginUsername);
            $("#rememberMe").attr("checked", true);
        }
        $("#login-Btn").click(function(){
            /*  , ,  md5   */
            $("#password").val($.md5($("#password").val()));
            if($("#rememberMe").is(":checked") == true){
                $.cookie("loginUsername", $("#username").val(), {expires: 365});
            }else{
                $.cookie("loginUsername", null, {expires: -1});
            }
            $("#loginForm").submit();
        });
    });
</script>2. 인증번호
이 예에서 검증은 Google의 Kaptcha를 사용합니다.
<bean id="captchaConfig" class="com.google.code.kaptcha.util.Config">
    ... ...
</bean>
<bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha" p:config-ref="captchaConfig" /><bean id="authenticationViaFormAction" class="org.jasig.cas.web.flow.AuthenticationViaFormAction"
        p:centralAuthenticationService-ref="centralAuthenticationService"
        p:warnCookieGenerator-ref="warnCookieGenerator"/><bean id="authenticationViaFormAction" class="com.buession.cas.web.flow.AuthenticationCaptchaViaFormAction"
        p:captchaConfig-ref="captchaConfig"
        p:centralAuthenticationService-ref="centralAuthenticationService"
        p:warnCookieGenerator-ref="warnCookieGenerator" /><bean id="handlerMappingC" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/captcha.jpg">captchaController</prop><!--   Controller -->
            <prop key="/validateCaptcha">validateCaptchaController</prop><!--   Controller,  -->
            ... ...
        </props>
    </property>
</bean>
<bean id="captchaController" class="com.buession.cas.web.controller.CaptchaController"
    p:config-ref="captchaConfig" />
<bean id="validateCaptchaController" class="com.buession.cas.web.controller.ValidateCaptchaController" 
    p:config-ref="captchaConfig" />3. 사용자 인증
<bean id="masterJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
    p:dataSource-ref="masterDataSource" />
<bean id="slaveJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
    p:dataSource-ref="slaveDataSource" />
<bean id="masterDataSource" class="org.apache.commons.dbcp.BasicDataSource"
    ... ...
    destroy-method="close" />
<bean id="slaveDataSource" class="org.apache.commons.dbcp.BasicDataSource"
    ... ...
    destroy-method="close" /><var name="credentials" class="org.jasig.cas.authentication.principal.UsernamePasswordCredentials" /><var name="credentials" class="com.buession.cas.authentication.principal.RememberMeUsernamePasswordCaptchaCredentials" /><view-state id="viewLoginForm" view="casLoginView" model="credentials">
    <binder>
        <binding property="username" />
        <binding property="password" />
    </binder>
    ... ...
</view-state><view-state id="viewLoginForm" view="casLoginView" model="credentials">
    <binder>
        <binding property="username" />
        <binding property="password" />
        <binding property="validateCode" />
    </binder>
    ... ...
</view-state><bean id="authenticationManager" class="org.jasig.cas.authentication.AuthenticationManagerImpl">
    ... ...
    <property name="authenticationHandlers">
        <list>
            <bean class="com.domain.authentication.handler.DatabaseAuthenticationHandler">
                <property name="jdbcTemplate" ref="slaveJdbcTemplate" />
                <!--(1)--><property name="sql" value="SELECT `password`, `salt`, `algo` FROM `member` WHERE `username` = ? LIMIT 1" />
                <!--(2)--><property name="sql" value="SELECT `password`, `salt`, `algo` FROM `member` WHERE `username` = ? OR `email` = ? OR `mobile` = ? LIMIT 1" />
                <!--(3)--><property name="sql" value="SELECT `password`, `salt`, `algo` FROM `member` WHERE `username` = ? OR `email` = ? OR `mobile` = ?" />
                <!-- (1) ;(2) , ;(3) , , :  username  :13800138000,  mobile  :13800138000   -->
                <property name="passwordEncoder" ref="passwordEncoder" />
            </bean>
        </list>
    </property>
</bean>class DatabaseAuthenticationHandler extends com.buession.cas.authentication.handler.support.DatabaseQueryAuthenticationHandler {
    @Override
    protected boolean authenticateUsernamePasswordInternal(UsernamePasswordCredentials credentials)
            throws AuthenticationException {
        PasswordEncoder passwordEncoder = (PasswordEncoder) getPasswordEncoder();
        String username = getPrincipalNameTransformer().transform(credentials.getUsername());
        String password = credentials.getPassword();
        (1)、(2)
        try {
            final Map<String, Object> r = jdbcTemplate.queryForMap(sql, username, username,
                    username);
            if (valid(username, password, r, passwordEncoder) == true) {
                 /**
                   *  , 
                 */
                if (Mcrypt.MD5.equals(r.get("algo")) == true) {
                    modifyEncoder((String) r.get("username"), credentials.getPassword(),
                            (String) r.get("salt"));
                }
                return ture;
            }
        } catch (IncorrectResultSizeDataAccessException e) {
        }
        (3)
        try {
            List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, username, username,
                    username);
            if (result != null && result.size() > 0) {
                for (Map<String, Object> r : result) {
                    if (valid(username, password, r, passwordEncoder) == true) {
                        /**
                         *  , 
                         */
                        if (Mcrypt.MD5.equals(r.get("algo")) == true) {
                            modifyEncoder((String) r.get("username"), credentials.getPassword(),
                                    (String) r.get("salt"));
                        }
                        return true;
                    }
                }
            }
        } catch (IncorrectResultSizeDataAccessException e) {
        }
        return false;
    }
    private boolean valid(String username, String password, final Map<String, Object> object,
            PasswordEncoder passwordEncoder) {
        String salt = (String) object.get("salt");
        String algo = (String) object.get("algo");
        passwordEncoder.setAlgo(algo);
        /**
         *   "MD5", 
         *  , ,  MD5  ,
         *   MD5  , ,  encode(password+salt)
         */
        if (Mcrypt.MD5.equals(algo) == true) {
            password += salt;
        } else {
            passwordEncoder.setSalt(salt);
        }
        final String encodedPassword = passwordEncoder.encode(password);
        return encodedPassword != null && encodedPassword.equalsIgnoreCase((String) object.get("password"));
    }
    private void modifyEncoder(final String username, final String password, final String salt) {
        PasswordEncoder passwordEncoder = (PasswordEncoder) getPasswordEncoder();
        passwordEncoder.setAlgo(Mcrypt.SHA512);
        passwordEncoder.setSalt(salt);
        String sql = "UPDATE `member` SET `algo` = ?, `password` = ? WHERE `username` = ?";
        jdbcTemplate.update(sql, Mcrypt.SHA512, passwordEncoder.encode(password), username);
    }
}<bean id="passwordEncoder" class="com.buession.cas.authentication.handler.PasswordEncoder"
    p:characterEncoding="UTF-8" />required.captcha= 
INVALID_CAPTCHA= 이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.