Play Framework:如何将当前请求传递给正文解析器

时间:2015-05-09 21:55:10

标签: scala playframework

我为我的控制器实现了SecureAction,如下所示:

class SecureRequest[A](
  val token: Token,
  request: Request[A]) extends WrappedRequest[A](request) {
  ...
}

class SecureAction[T <: Controller : TypeTag] private(
  private val methodName: String,
  private val tokenTypes: Seq[TokenType]) extends ActionBuilder[SecureRequest] {

  def invokeBlock[A](request: Request[A], block: SecureRequest[A] => Future[Result]) = {
    ...
  }
}

def saveFile = SecureAction.async(fsBodyParser) { implicit request =>

  // code here not executed if current user has not required privileges
  ...
}

一切正常......除非请求 NOT 授权fsBodyParser仍然被调用,并且多部分文件保存在数据库中。

隐式request对象包含安全规则......那么是否可以将请求以某种方式传递给正文解析器?

修改

这是我的身体解析器......

fsBodyParser()(
  implicit fsService: FsServiceComponent#FsService
): BodyParser[MultipartFormData[Future[MetaFile]]] = {
  import BodyParsers.parse._

  multipartFormData(
    Multipart.handleFilePart {
      case Multipart.FileInfo(partName, filename, contentType) =>
        fsService.iteratee(filename, contentType)
    }
  ) 
}

我可能需要一个可以从动作主体调用的方法,以便不会绕过安全性。我不清楚身体特征应该是什么样子:

def saveFile = SecureAction.async(fsBodyParser) { implicit request =>

  // how should the signature of this method look like???
  parseMultpart(request.body  ???)

  ...
}

1 个答案:

答案 0 :(得分:2)

BodyParser[T]RequestHeaderIteratee[Array[Byte], Either[Result, A]]的函数,因此在执行时它可以访问请求标头。

虽然我会说 Play!Request => Future[Result]管道的意图是让BodyParser只是转换传入的身体,而不是对身体采取行动。我建议您不要将文件存储在bodyParser阶段,但只有在调用SecureAction时才会将该文件存储起来,并从请求中检索正文。