将自定义BodyParser添加到非类Action

时间:2016-07-01 12:03:00

标签: scala playframework

我正在使用PlayFramework / Scala构建应用程序。

对于我的安全层,我使用 Auth0 ,这对主页面工作正常,我已经能够获取个人资料信息/添加新用户等。

现在我有一个API,我想让人们只在连接时使用它,所以我在我的API控制器上添加了自定义操作

  def AuthenticatedAction(f: Request[AnyContent] => Future[Result]): Action[AnyContent] = {
    Action.async { implicit request =>

      (request.session.get("idToken").flatMap { idToken =>
        cache.get[JsValue](idToken + "profile")
      } map { profile =>
        f(request) // IF USER CONNECTED THEN ADD PROFILE TO REQUEST AND PROCEED
      }).orElse {
        Some(Future(Redirect("/login"))) // OTHERWISE REDIRECT TO LOGIN PAGE
      }.get
    }
  }

我可以将它用于我的阅读操作(仅按ID返回一条记录):

def read(entityName: String, id: String) = AuthenticatedAction {
   // SOME NOT RELEVANT CODE     
}

当我尝试发送json来创建对象时,我的问题出现了:

在我尝试添加自定义身份验证操作之前,这是我的代码工作:

def store(entityName: String, id: String) = Action.async(parse.json) {
      // SOME NOT RELEVANT CODE
}

现在我希望使用

def store(entityName: String, id: String) = AuthenticatedAction(parse.json) {
    // SOME NOT RELEVANT CODE
}

这是编译错误:

  type mismatch; found : play.api.mvc.BodyParser[play.api.libs.json.JsValue]
  required: play.api.mvc.Request[play.api.mvc.AnyContent] ⇒ scala.concurrent.Future[play.api.mvc.Result]

我知道这是因为我不支持传递自定义正文解析器这一事实,我已经考虑过使用文档中的 ActionBuilder ,但我正在尝试使用Auth0提供的代码。

当自定义操作未定义为类时,是否有办法处理自定义解析器?

1 个答案:

答案 0 :(得分:0)

所以我找到了解决方案!

我注意到操作异步实际上有 2 个不同的签名:

async[A](bodyParser: BodyParser[A])(block: (R[A]) ⇒ Future[Result]): Action[A] 

 async(block: ⇒ Future[Result]): Action[AnyContent] 

所以我刚刚添加了另一个 AuthenticationAction

  def AuthenticatedAction[A](b: BodyParser[A])(f: Request[A] => Future[Result]): Action[A] = {
    Action.async(b) { implicit request =>

      (request.session.get("idToken").flatMap { idToken =>
        cache.get[JsValue](idToken + "profile")
      } map { profile =>
        f(request) // IF USER CONNECTED THEN ADD PROFILE TO REQUEST AND PROCEED
      }).orElse {
        Some(Future(Redirect("/login")))
      }.get
    }
  }