2012-06-19 21 views
6

Me gustaría poder utilizar un BodyParser en una solicitud autenticada y tengo problemas para averiguar cómo hacerlo si mi autenticación está configurada como ZenTasks ejemplo.Play 2.0 Framework, utilizando un BodyParser con una solicitud autenticada

Mi método de autenticación,

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

Mi método controlador,

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

Este es el error que estoy viendo,

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

Aquí es una pregunta relacionada: parse.json of authenticated play request

Esta persona encontró una solución, y creo que hay una para el ejemplo de archivo temporal también, pero me gustaría saber cómo (o por qué) lo que estoy haciendo no funciona.

Respuesta

6

Creo que lo he descubierto, principalmente porque dejé algunos detalles de la pregunta original que no sabía que eran importantes.

El problema era que estaba envolviendo un Action { Action { } } porque el método IsAuthenticated ya tenía una llamada a la función Action dentro de él. Lo que terminé haciendo fue sobrecargar la función IsAuthenticated con un método que tomó BodyParser como parámetro. Debido a que estoy usando el método TemporaryFile, que no es una subclase de AnyContent, también tuve que cambiar el tipo de solicitud.

Ahora bien, esto es lo que mi Secured rasgo se ve así:

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

Y esto es lo que se ve como mi regulador:

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

Espero que esto ayude a alguien más!

+0

Ah, me alegro de que lo resolvió al final :) – opyate

Cuestiones relacionadas