2012-06-19 12 views
6

認証されたリクエストでBodyParserを使用できるようにしたいと思います。認証がZenTasksのように設定されている場合、例。Play 2.0フレームワーク、認証済みリクエストでBodyParserを使用

私の認証方法、

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 of authenticated play request

は、

この人は回避策を見つけました。私は一時ファイルの例もあると思いますが、私がやっていることがどうやって働いているのか知りたいのですが。

答えて

6

私がこれを理解したと思うのは、主に私が気づいていなかった元の質問からいくつかの詳細を残したからです。

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

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

願っています!

+0

ああ、うれしく終わりに解決しました:) – opyate

関連する問題