Scala 重头戏:如何防止在操作代码未执行的情况下调用主体解析器

Scala 重头戏:如何防止在操作代码未执行的情况下调用主体解析器,scala,playframework,Scala,Playframework,我创建了一个自定义操作,以防止未经授权的用户访问受保护的功能: class SecureAction extends ActionBuilder[SecureRequest] { def invokeBlock[A](request: Request[A], block: SecureRequest[A] => Future[Result]) = { ... future.flatMap { case token if (!isAuthorized(tok

我创建了一个自定义
操作
,以防止未经授权的用户访问受保护的功能:

class SecureAction extends ActionBuilder[SecureRequest] {

  def invokeBlock[A](request: Request[A], block: SecureRequest[A] => Future[Result]) = {
    ...
    future.flatMap {
      case token if (!isAuthorized(token)) =>
        Logger.info(s"request ${request.path} not authorized: user ${token.username} does not have required privileges")
        Future.successful(Unauthorized(error(requestNotAuthorized))))
      case ...
    }
  }
}
如果当前用户未经授权,则
SecureAction
返回
Unauthorized
,并且从不执行提供的操作代码。下面是我的
控制器的外观:

object MyController extends Controller {

  ...

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

    // code here not executed if current user has not required privileges
    ...
  }
}
问题是,即使当前用户未经授权并且
SecureAction
返回
Unauthorized
而不执行操作代码,主体解析器仍然会被调用。。。这不是我所期望的


也就是说,问题是:如果
SecureAction
返回
Unauthorized
,如何防止主体解析器(即
fsBodyParser
)被调用?

看看EssentialAction()

如你所见,这是本质的定义:

trait EssentialAction extends (RequestHeader) ⇒ Iteratee[Array[Byte], SimpleResult] with Handler
因此,如果您想在请求头级别进行操作,请选择EssentialActions。与Action/ActionBuilder不同,它们不需要与BodyParser交互

值得一提的是@marius soutier的这篇精彩文章: