BodyParser 在身份验证操作之前工作

问题描述 投票:0回答:2

我已经实现了身份验证操作并将其放在控制器中每个方法的开头

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 过滤器进行身份验证?

playframework playframework-2.3
2个回答
0
投票

我已按以下方式实现它(使用 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)
    }
  }

0
投票

您可以在conf/application.conf中全局启用延迟正文解析: play.server.deferBodyParsing = true

或每条路线:

+ deferBodyParsing POST / addFile(itemId: Long)

并按照通常的方式写:

def addFile(itemId: Long) = AuthenticatedAction.async(FSBodyParser(itemId)) { request => ??? }

© www.soinside.com 2019 - 2024. All rights reserved.