BodyParser работает до действия аутентификации

Я реализовал действие аутентификации и поместил его в начало каждого метода в моем контроллере def addFile(itemId: Long) = AuthenticatedAction.async(FSBodyParser(itemId)){ request => ...

Затем я реализовал свой собственный парсер тела на основе MultipartFormData.

 def FSBodyParser(itemId:Long): BodyParser[MultipartFormData[Future[BaseFileInfo]]] = {
    multipartFormData(Multipart.handleFilePart {
      case Multipart.FileInfo(partName, filename, contentType) =>
        //println(s"FileInfo($partName, $filename, $contentType)")
        getIteratee(1, itemId, filename, contentType)
    })
  }

И я обнаружил, что сначала загружается мой файл, а затем действие проверки подлинности проверяет, действителен ли пользователь. Я хотел бы сначала проверить подлинность пользователя и только после этого сохранить загруженный файл.

Есть ли у вас какие-либо идеи, как реализовать это наилучшим образом? Возможно, вы используете фильтры Play для аутентификации?


person Kir    schedule 16.10.2014    source источник


Ответы (1)


Я реализовал это следующим образом (используя EssentialAction)

def authenticate(): Future[Option[Long]] = {
    // here we should pass correct user id
    Future.successful(Some(421))
  }

  def Authenticated[A](action: Action[A]) = EssentialAction{ rh =>
    Iteratee.flatten(authenticate() map{
      case Some(userId) => action(rh)
      case None => Done(Results.Unauthorized)
    })
  }

 //this is method of my service
 //Authenticated is called before FSBodyParser starts working
 def addFile(itemId: Long) = Authenticated{
    Action.async(FSBodyParser(itemId)){ requestHeaders =>
      ItemRepository.addFile(1, itemId, null) map( fileId => Ok)
    }
  }
person Kir    schedule 20.10.2014