2012-06-19 10 views
6

Ich würde gerne einen BodyParser auf eine authentifizierte Anfrage verwenden und ich habe Probleme herauszufinden, wie das zu tun, wenn meine Authentifizierung wie die ZenTasks eingerichtet ist Beispiel.Play 2.0 Framework, mit einem BodyParser mit einer authentifizierten Anfrage

Meine Authentifizierungsmethode,

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 
    } 
} 

Mein Controller-Methode,

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

Dies ist der Fehler ich sehen werde,

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

Hier ist eine weitere Frage: parse.json of authenticated play request

Diese Person hat einen Workaround gefunden, und ich glaube, dass es auch einen für das Beispiel mit temporären Dateien gibt, aber ich würde gerne wissen, wie (oder warum) das, was ich mache, nicht funktioniert.

Antwort

6

Ich glaube, ich habe das herausgefunden, hauptsächlich weil ich einige Details aus der ursprünglichen Frage herausgelassen habe, von denen ich nicht wusste, dass sie wichtig sind.

Das Problem war, dass ich ein Action { Action { } } wickeln würde, weil die IsAuthenticated-Methode bereits einen Aufruf an die Action-Funktion hatte. Was ich getan habe, war die IsAuthenticated Funktion mit einer Methode zu überladen, die BodyParser als Parameter nahm. Da ich die Methode TemporaryFile verwende, die keine Unterklasse von AnyContent ist, musste ich auch den Anforderungstyp ändern. Jetzt

, ist das, was meine Secured Eigenschaft wie folgt aussieht:

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 
    } 
} 

Und das ist, was mein Controller wie folgt aussieht:

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

Hope this jemand anderes hilft!

+0

Ah, froh, dass du es am Ende gelöst hast :) – opyate

Verwandte Themen