【发布时间】:2014-09-28 14:42:56
【问题描述】:
我正在编写一个将多部分文件作为输入并将它们上传到 S3 实例的 Web 应用程序。由于某些文件可能非常大,因此我使用自定义的 Body Parser 在块进入时将它们发送到 S3。
我想在上传文件之前对请求进行验证(检查用户是否有权限/足够的空间等)。通过阅读 Play 文档,扩展 ActionBuilder 似乎是正确的方法。我在 SecureSocial 中注意到,有一个 SecureActionBuilder,我相信我应该扩展它以构建一个安全的操作(这就是我想要的)。
我尝试了这个简单的测试,看看我是否可以打印出 userId,从而能够根据用户执行操作。
object FileValidationAction extends SecuredActionBuilder {
def invokeBlock[A](request: SecuredRequest[A], block: SecuredRequest[A] => Future[SimpleResult]) = {
Logger.info("User id is " + request.user.userProfile.userId)
block(request)
}
}
但是,该方法从未被调用。
接下来,我尝试覆盖 SecuredActionBuilder 对象中的方法:
object FileValidationAction extends SecuredActionBuilder {
override def invokeBlock[A](request: Request[A], block: SecuredRequest[A] => Future[SimpleResult]) = {
val securedResult: Option[SecuredRequest[A]] = request match {
case r: SecuredRequest[A] => Option(r)
case _ => None
}
Logger.info("Calling action ------- WOO!")
securedResult match {
case Some(r) =>
block(r)
case _ =>
Future.successful(Forbidden)
}
}
}
该方法被调用,但传入的请求不是我希望的 SecuredRequest。
如何使用自定义正文解析器构建 SecuredAction,我可以在它完成(甚至开始)上传之前对其进行验证?
编辑:
为了澄清,我将使用以下方法签名调用 Action:
def upload = FileValidationAction(streamingBodyParser(streamConstructor)) { request =>
【问题讨论】:
标签: scala playframework securesocial