2014-09-28 4 views
1

내가하고 있어요 구문 분석하기 전에 요청의 유효성을 검사하는 SecureActionBuilder을 확장합니다. 파일 중 일부는 매우 클 수 있기 때문에 사용자 지정 Body Parser를 사용하여 들어오는 S3에 청크를 보내고 있습니다.입력으로 다중 파일을 소요하고 S3 인스턴스에 업로드 웹 응용 프로그램을 작성하는 몸

파일을 업로드하기 전에 요청에 대한 유효성 검사를하고 싶습니다. 사용자에게 사용 권한/충분한 공간 등이 있음). Play 문서를 읽으면서 ActionBuilder를 확장하는 것이 올바른 방법이라고 생각합니다. 나는 SecureSocial에서 SecureActionBuilder를 발견했으며 안전한 동작을 구축하기 위해 이것을 확장해야한다고 믿는다.

은 내가 때문에 사용자에 따라 작업을 수행 할 수있는, 사용자 ID를 출력 할 수 있는지를보기 위해 간단한 테스트를 시도했다.

object FileValidationAction extends SecuredActionBuilder { 
    def invokeBlock[A](request: SecuredRequest[A], block: SecuredRequest[A] => Future[SimpleResult]) = { 
    Logger.info("User id is " + request.user.userProfile.userId) 
    block(request) 
    } 
} 

그러나이 메서드는 절대로 호출되지 않았습니다.

다음, 나는 SecuredActionBuilder 개체에서 메서드를 재정의하려고 :

object FileValidationAction extends SecuredActionBuilder { 
    override def invokeBlock[A](request: Request[A], block: SecuredRequest[A] => Future[SimpleResult]) = { 
    val securedResult: Option[SecuredRequest[A]] = request match { 
     case r: SecuredRequest[A] => Option(r) 
     case _ => None 
    } 
    Logger.info("Calling action ------- WOO!") 
    securedResult match { 
     case Some(r) => 
     block(r) 
     case _ => 
     Future.successful(Forbidden) 
    } 
    } 
} 

메서드를 호출하지만, 들어오는 요청이 내가 기대했다으로 SecuredRequest 아니다 가져옵니다.

어떻게 내가 그것을 업로드를 완료 (또는 시작) 이전에 검증 할 수있는 사용자 정의 몸 파서를 사용하여 SecuredAction를 구축합니까?

편집 :

def upload = FileValidationAction(streamingBodyParser(streamConstructor)) { request => 

답변

3

문제는 당신이 실제로 경우 확인 SecuredActionBuilder에서 원래의 코드를 호출하지 않는 것입니다 :

나는 다음과 같은 방법 서명 작업을 호출됩니다, 명확히하기 사용자가 있으며 SecuredRequest 인스턴스를 구성합니다. 이 같은

뭔가 작업을해야합니다 :

// A sample usage of the action 
def checkFile = FileValidationAction { request => 
    Ok("") 
    } 

// The builder implementation 
    object FileValidationAction extends FileValidationActionBuilder { 
    def apply[A]() = new FileValidationActionBuilder() 
    } 

    class FileValidationActionBuilder(authorize: Option[Authorization[DemoUser]] = None) extends SecuredActionBuilder(authorize) { 
    def validateFile[A](block: SecuredRequest[A] => Future[SimpleResult]): SecuredRequest[A] => Future[SimpleResult] = { securedRequest => 
     Logger.info(s"User id is ${securedRequest.user.main.userId}") 
     block(securedRequest) 
    } 

    override def invokeBlock[A](request: Request[A], block: (SecuredRequest[A]) => Future[SimpleResult]): Future[SimpleResult] = { 
     invokeSecuredBlock(authorize, request, validateFile(block)) 
    } 
    } 

당신은이 작업을 사용하려면 컨트롤러 내에서이 문제를 추가해야합니다. 여러 컨트롤러에서 사용해야하는 경우 확장 할 수있는 특성을 만듭니다.

또한이 샘플 코드에서 내가 샘플에있는 DemoUser 유형을 사용하고 있습니다. 사용자를 나타 내기 위해 앱에서 사용하는 유형으로 변경해야합니다.

+0

이 완벽하게 작동, 감사합니다! – eliot

+0

당신을 환영합니다! – Jorge

+0

아직도 오류가 발생합니다. BodyParser는 파일 유효성 검사가 수행되기 전에 실행됩니다. 업로드하기 전에 파일을 검사해야합니다. 이 일을 할 수있는 방법이 있습니까? – eliot