2014-07-16 3 views
2

양식을 수락하는 컨트롤러가 있습니다. POST. 컨트롤러의이 메소드/액션은 Spring Security에 의해 보호됩니다. 이 경우 사용자의 세션이 만료되었으며 제출 버튼을 클릭합니다.Grails & Spring Security - 저장된 요청 - 빈 매개 변수 및 언 바운드 명령 객체

스프링 보안은 저장된 요청을 생성하고 사용자를 로그인 페이지로 리디렉션합니다. 로그인시 스프링 시큐리티는 양식의 POST URL로 리디렉션하고 있습니다. 그러나 제어기 메소드/조치 내의 매개 변수는 비어 있으며 (제어기 및 조치 이름 제외) 명령 오브젝트는 채워지지 않습니다.

onInteractiveAuthenticationEvent 내의 간단한 코드를 사용하면 저장된 요청에 매개 변수 맵의 모든 매개 변수가 있음을 알 수 있습니다.

grails.plugins.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx -> 

    def request = org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder.getRequest() 
    def response = org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder.getResponse() 
    org.springframework.security.web.savedrequest.SavedRequest savedRequest = new org.springframework.security.web.savedrequest.HttpSessionRequestCache().getRequest(request, response); 

    println savedRequest 
    if (savedRequest) { 
     savedRequest.getParameterMap().each { k, v -> 
      println "${k}: ${v}" 
     } 
    } 
} 

컨트롤러 작업/메소드에 대한 params 및 command 객체가 비어 있고 언 바운드 된 이유는 무엇입니까? 로그인 성공 후 저장된 요청은 두 매개 변수를 채우고 차례대로 매개 변수에 바인딩하는 데 사용됩니다.

Grails 2.0.4, Spring Security Core Plugin 1.2.7.3 및 Grails 2.4.2와 Spring Security Core Plugin 2.0-RC3에서 테스트했습니다.

+0

명령 개체는 현재 요청에있는 것만 포함하여 채워집니다. Spring 보안이 저장된 요청으로 무엇을하는지는 모르지만 리다이렉션을 시작할 때 재사용을 위해 요청 매개 변수를 검색하지 않는 것 같습니다. –

+0

@JeffScottBrown 동의하고 그게 문제입니다. Spring Security에 대한 나의 이해를 바탕으로해야 할 것 같습니다. 필자는 Spring Security와 Grails 플러그인을 분리하여 누군가가 다른 방향으로 나를 가리킬 수 없다면 왜 이런 일이 일어나지 않는지 알 수있을 것입니다 (나는 기대하고있었습니다). –

+0

여기에도 같은 문제가 있습니다. https://jira.grails.org/browse/GPSPRINGSECURITYCORE-297 –

답변

2

Spring Security 사용자 (구현 자)에게 이것이 Grails 필터를 사용하기로 결정한 것으로 보입니다. 스프링 보안 필터를 사용하여 구현 될 수 있었고 (스프링 시큐리티 API 문서에 명시된대로) 필터 체인에 배치 될 수 있었지만 다른 것들로 이동해야했습니다.

그래서 여기에 내가 한 일례가 있습니다.

package com.example 

class SavedRequestFilters { 

    def filters = { 
     // only after a login/auth check to see if there are any saved parameters 
     savedRequestCheck(controller: 'login', action: 'auth') { 
      after = { 
       org.springframework.security.web.savedrequest.SavedRequest savedRequest = new org.springframework.security.web.savedrequest.HttpSessionRequestCache().getRequest(request, response) 
       if (savedRequest) { 
        // store the parameters and target uri into the session for later use 
        session['savedRequestParams'] = [ 
         uri: savedRequest.getRedirectUrl(), 
         data: savedRequest.getParameterMap() 
        ] 
       } 
      } 
     } 

     all(controller:'*', action:'*') { 
      before = { 
       // if the session contains dr saved request parameters 
       if (session['savedRequestParams']) { 
        def savedRequestParams = session['savedRequestParams'] 
        // only if the target uri is the current will the params be needed 
        if (savedRequestParams.uri.indexOf("/${controllerName}/") > -1) { 
         savedRequestParams.data.each { k, v -> 
          params[k] = v.join(",") 
         } 
         // clear the session storage 
         session['savedRequestParams'] = null 
        } 
       } 
      } 
     } 
    } 
} 
+0

및 멀티 파트 양식에서 보낸 매개 변수는 어떻게 구합니까? – Sachin

+0

잘 모르겠습니다. 나는 멀티 파트 폼이'savedRequestParams'에 의해 지원되지 않는다는 사실을 기억하는 것 같다. 당신이 반드시 소스 코드를 탐색해야한다. –