Jef*_* Wu 6 parsing scala playframework
我希望能够使用BodyParser上验证的请求,我有麻烦搞清楚怎么做,如果我的身份验证设置,如ZenTasks例子.
我的身份验证方法
def IsAuthenticated(f: => String => Request[AnyContent] => Result) = {
Security.Authenticated(username, onUnauthorized) { user =>
Action(request => f(user)(request))
}
}
def HasRole(role: List[String])
(f: => String => Request[AnyContent] => Result) = IsAuthenticated {
user => request => if (role.contains(getRole(user))) {
f(user)(request) // This function returns the result.
} else {
Results.Forbidden
}
}
Run Code Online (Sandbox Code Playgroud)
我的控制器方法,
def controller = HasRole(List("admin")) { user => _ => {
Action(parse.temporaryFile){ implicit request =>
request.body.moveTo(new File("/tmp/filepath"))
Redirect(routes.home)
}
}
Run Code Online (Sandbox Code Playgroud)
这是我看到的错误,
[error] found : play.api.mvc.Action[play.api.libs.Files.TemporaryFile]
[error] required: play.api.mvc.Result
[error] Action(parse.temporaryFile){ implicit request =>
[error] ^
Run Code Online (Sandbox Code Playgroud)
这是一个相关的问题:经过身份验证的播放请求的parse.json
这个人找到了一个解决方法,我相信还有一个用于临时文件示例,但我想知道我正在做什么(或为什么)不起作用.
我相信我已经想到了这一点,主要是因为我从原始问题中留下了一些我没有意识到的重要细节.
问题是我正在包装一个Action { Action { } }
因为该IsAuthenticated
方法已经调用了Action
它内部的函数.我最终做的是IsAuthenticated
用一个BodyParser
作为参数的方法重载函数.因为我使用的TemporaryFile
方法不是子类AnyContent
,我还必须更改请求类型.
现在,这就是我的Secured
特质:
def IsAuthenticated(f: => String => Request[Any] => Result) = {
Security.Authenticated(username, onUnauthorized) { user =>
Action(request => f(user)(request))
}
}
def IsAuthenticated(b: BodyParser[Any] = parse.anyContent)
(f: => String => Request[Any] => Result) = {
Security.Authenticated(username, onUnauthorized) { user =>
Action(b)(request => f(user)(request))
}
}
def HasRole(role: List[String])(b: BodyParser[Any] = parse.anyContent)
(f: => String => Request[Any] => Result) = IsAuthenticated(b) {
user => request => getRole(user) match {
case Some(r) if role.contains(r) => f(user)(request)
case _ => Results.Forbidden
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我的控制器的样子:
def controller = HasRole(List("admin"))(parse.temporaryFile) { user => request =>
request.body match {
case b:TemporaryFile => b.moveTo(new File("/tmp/file"))
case _ => Status(404)
}
}
Run Code Online (Sandbox Code Playgroud)
希望这有助于其他人!
归档时间: |
|
查看次数: |
2389 次 |
最近记录: |