0

私は springSecurity プラグインを自分のニーズに合わせようとしているので、ユーザーが認証されると、キーがユーザーに対して有効であることが確認され、ユーザーのセッションに保存される必要があります (ユーザーは複数のキーを持つことができます)。

フォームログイン:

<form action='${request.contextPath}/j_spring_security_check' method='POST' id='loginForm' name='loginForm' controller="login" onLoading="showSpinner();" onComplete="hideSpinner();" class="form-horizontal" autocomplete='off'>
                  <g:if test='${flash.msg}'><div class='errors_pw3'><g:message code="default.message.login"/> </div><br/></g:if>
                  <div class="control-group" style="margin-left:80px;">
                      <label class="control-label" for='j_datastore'><g:message code="label.datastore" default="Key:" /></label>
                          <div class="controls">
                          <input type='text'  name='key' id='key' value='${session.user.key}' class="span7"/>
                      </div>
                </div>
                <div class="control-group" style="margin-left:80px;">
                    <label class="control-label" for='j_username'><g:message code="label.ubistoreid" /></label>
                    <div class="controls">
                        <input type='text'  name='j_username' id='username' value='${request.remoteUser}' class="span7"/>
                    </div> 
                </div>
                <div class="control-group" style="margin-left:80px;">
                    <label class="control-label" for='j_password'><g:message code="label.password" /></label>
                    <div class="controls">
                        <input type='password'  name='j_password' id='password' class="span7"/>
                    </div>
               </div>

ログイン コントローラ:

def auth = {
    def config = SpringSecurityUtils.securityConfig
    def principal = springSecurityService.principal
    // Store key in the session
    session.setAttribute("KEY",params.key)
    println params.key + "*******"
    println params.params + "-----"
    if (springSecurityService.isLoggedIn()) {
        redirect uri:'/secure'
    }
    else if (params["login_error"]) {
        if(request.getParameterValues('login_error')[0] == '1') {
            flash.msg = "User or password invalid !"
        }
    }
    String view = 'index'
    String postUrl = "${request.contextPath}${config.apf.filterProcessesUrl}"
    render view: view, model: [postUrl: postUrl,rememberMeParameter: config.rememberMe.parameter,params:params]
}

パラメータはセッションに渡されません

springSecurityService を次のように変更する方法を教えてください。(ユーザー ドメイン クラスには、set<Key> keys承認されたキーのリストを含むエントリが含まれます)

2)後でユーザーのセッションで使用します(認証されたら)

4

1 に答える 1

0

基本的に、customRedirect 戦略を実装しました。動作しますが、現在のユーザーのキー オブジェクトの有効性を確認した後、応答をカスタマイズするためのアドバイスが必要です。

import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
import org.apache.commons.lang.StringUtils
import org.springframework.security.web.DefaultRedirectStrategy

public class CustomRedirectStrategy extends DefaultRedirectStrategy {

    static final String adminFailureUrl='/console/index'
    static final String customerFailureUrl='/login/auth'
    HttpServletRequest request
    HttpServletResponse response
    String url
    String redirectUrl

    @Override
    public void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) throws IOException {
        def key = request.getParameter("j_key")
        if(key) {
            // TODO: process key validation
            request.session['KEY'] = key
            def ds = DataStore.findByKeyname(key)
            if(ds) {
                request.session['DS'] = ds
            }
            log.debug '--------------------'
            log.debug 'Used Key:'+ key
            log.debug '--------------------'
        } else {
            log.debug '--------------------'
            log.debug 'No key defined'
            log.debug '--------------------'
        }

        if(request.getParameter('asAdmin') == 'true') {
            redirectUrl = calculateAdminRedirectUrl(request);
        }
        else if (request.getParameter('asUser') == 'true') {
            redirectUrl = calculateUserRedirectUrl(request);
        }
        redirectUrl = response.encodeRedirectURL(redirectUrl);
        response.sendRedirect(redirectUrl);
    }

    private String calculateAdminRedirectUrl(final HttpServletRequest request) {
        return  request.getContextPath() + adminFailureUrl + "?login_error=1";
    }

    private String calculateUserRedirectUrl(final HttpServletRequest request) {
        return  request.getContextPath() + customerFailureUrl + "?login_error=1";
    }
}
于 2013-05-01T21:19:12.930 に答える