【问题标题】:Play Framework: How to pass the current request to a body parserPlay Framework:如何将当前请求传递给正文解析器
【发布时间】:2015-05-10 14:31:43
【问题描述】:

我已经为我的控制器实现了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
  ...
}

一切正常...除了即使请求授权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  ???)

  ...
}

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    BodyParser[T] 是一个从RequestHeaderIteratee[Array[Byte], Either[Result, A]] 的函数,所以它在执行时确实可以访问请求头。

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

    【讨论】:

    • ... 但是如果是 MultipartFormData,我该如何管理?我不想让 Play 将传入数据保存到临时文件中(我的 fsBodyParser 将传入数据直接存储到 MongoDB 中)。
    • 您可以将其定义为BodyParser[Iterratee[Array[Byte]],即与它相同的数据类型,让您将数据通过管道传输到 SecureAction,您可以在其中使用它并将其发送到 MongoDB。不确定 Iteratee 的管道语义
    • 我不清楚这种方法的签名应该是什么 - 请参阅我更新的问题。我应该创建一个将主体作为输入的方法吗?我开始迷路了;-)
    • 我自己没有处理过 Multipart,我必须更深入地研究 Multipart 正文解析以及从解析器到 Action 的管道如何工作。转到临时文件,虽然不如直接流入 MongoDB 那样理想,但可能要简单得多,至少目前是这样
    • 好的,为了您的大力支持 tx ;-)
    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 2013-05-11
    • 2021-11-12
    相关资源
    最近更新 更多