我为我的控制器实现了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 ???)
...
}
答案 0 :(得分:2)
BodyParser[T]
是RequestHeader
到Iteratee[Array[Byte], Either[Result, A]]
的函数,因此在执行时它可以访问请求标头。
虽然我会说 Play!中Request => Future[Result]
管道的意图是让BodyParser
只是转换传入的身体,而不是对身体采取行动。我建议您不要将文件存储在bodyParser阶段,但只有在调用SecureAction
时才会将该文件存储起来,并从请求中检索正文。