Play 2.0 Framework, using a BodyParser with an authenticated request

前端 未结 1 2036
挽巷
挽巷 2021-01-05 12:01

I\'d like to be able to use a BodyParser on an authenticated request and I\'m having trouble figuring out how to do that if my Authentication is set up like the ZenTasks exa

相关标签:
1条回答
  • 2021-01-05 12:35

    I believe I've figured this out, mainly because I left some details out of the original question that I did not realize were important.

    The problem was that I was wrapping an Action { Action { } } because the IsAuthenticated method already had a call to the Action function inside it. What I ended up doing was overloading the IsAuthenticated function with a method that took BodyParser as a parameter. Because I am using the TemporaryFile method, which is not a subclass of AnyContent, I also had to change the request type.

    Now, this is what my Secured trait looks like:

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

    And this is what my controller looks like:

    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 helps someone else!

    0 讨论(0)
提交回复
热议问题