2012-06-19 35 views
6

Tôi muốn có thể sử dụng Trình theo dõi thân máy trên yêu cầu đã được xác thực và tôi đang gặp khó khăn trong việc tìm hiểu cách thực hiện điều đó nếu Xác thực của tôi được thiết lập như ZenTasks thí dụ.Chơi 2.0 Framework, sử dụng BodyParser với yêu cầu được xác thực

phương thức xác thực của tôi,

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

phương pháp điều khiển của tôi,

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

Đây là lỗi tôi nhìn thấy,

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

Dưới đây là một câu hỏi liên quan: parse.json of authenticated play request

Người này tìm thấy cách giải quyết khác và tôi tin rằng có một ví dụ về tệp tạm thời, nhưng tôi muốn biết làm thế nào (hoặc lý do) những gì tôi đang làm không hoạt động.

Trả lời

6

Tôi tin rằng tôi đã tìm ra điều này, chủ yếu là vì tôi đã để lại một số chi tiết trong câu hỏi ban đầu mà tôi không nhận ra là quan trọng.

Vấn đề là tôi đã gói Action { Action { } } vì phương thức IsAuthenticated đã có cuộc gọi đến hàm Action bên trong. Những gì tôi đã kết thúc làm là quá tải chức năng IsAuthenticated với phương pháp mất BodyParser làm tham số. Vì tôi đang sử dụng phương thức TemporaryFile, đây không phải là lớp con của AnyContent, tôi cũng phải thay đổi loại yêu cầu.

Bây giờ, đây là những gì Secured đặc điểm của tôi trông giống như:

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

Và đây là những gì điều khiển của tôi trông giống như:

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

Hy vọng điều này sẽ giúp người khác!

+0

Ah, vui vì bạn đã giải quyết nó cuối cùng :) – opyate

Các vấn đề liên quan