6

認証されたリクエストで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
  }
}

私のコントローラーメソッド、

def controller = HasRole(List("admin")) { user => _ => { 
  Action(parse.temporaryFile){ implicit request =>
    request.body.moveTo(new File("/tmp/filepath"))
    Redirect(routes.home)
  }
}

これは私が見ているエラーです、

[error]  found   : play.api.mvc.Action[play.api.libs.Files.TemporaryFile]
[error]  required: play.api.mvc.Result
[error]       Action(parse.temporaryFile){ implicit request =>
[error]                                  ^

関連する質問は次のとおりです。認証された再生リクエストのparse.json

この人は回避策を見つけました。一時ファイルの例にも回避策があると思いますが、私が行っていることがどのように(またはなぜ)機能しないのか知りたいです。

4

1 に答える 1

6

私はこれを理解したと思います。主な理由は、元の質問から、重要であることに気づかなかった詳細をいくつか残したためです。

問題は、メソッド内に関数の呼び出しがすでにあるAction { Action { } }ため、をラップしていたことでした。私がやったことは、パラメーターとして受け取るメソッドで関数をオーバーロードすることでした。のサブクラスではないメソッドを使用しているため、リクエストタイプも変更する必要がありました。IsAuthenticatedActionIsAuthenticatedBodyParserTemporaryFileAnyContent

さて、これは私の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
  }
}

そして、これは私のコントローラーがどのように見えるかです:

def controller = HasRole(List("admin"))(parse.temporaryFile) { user => request =>
  request.body match {
    case b:TemporaryFile => b.moveTo(new File("/tmp/file"))
    case _ => Status(404)
  }
}

これが他の誰かに役立つことを願っています!

于 2012-06-20T13:41:32.910 に答える