Как совместить анализатор тела и безопасность в Play

Я использую вариант решения безопасности, реализованного в ZenTask в примере проекта:

Цель состоит в том, чтобы объединить withAuth и Action(parse.json), но я не могу понять, как это сделать.

Моя черта безопасности

def withAuth(f: => Int => Request[AnyContent] => Result) = {
    Security.Authenticated(userid, onUnauthorized) { userid =>
      Action(request => f(userid.toInt)(request))
    }
  }

Я хочу использовать пьесы, встроенные в анализатор тела, как обычно:

def newReport() = Action(parse.json) { request =>

Вместо того, чтобы вручную анализировать тело в json в моем контроллере.

def newReport() = withAuth { userId =>
    { request =>
      request.body.asJson match {
        case Some(json) =>
          json.validate[Report](Reports.readsWithoutUser).map {
            case _: Report =>
              Reports.newReport(_)
              Ok("")
          }.recoverTotal {
            e =>
              val errors = JsError.toFlatJson(e)
              Logger.error(errors.toString)
              BadRequest("Detected error:" + errors)
          }
        case None => BadRequest("Json object missing from request")
      }
    }

person Farmor    schedule 04.02.2013    source источник


Ответы (1)


Тогда вы должны просто использовать перегруженное действие, которое принимает анализатор тела (apply[A](bodyParser: BodyParser[A])(block: Request[A] => Result)).

def withAuth[A](p: BodyParser[A])(f: => Int => Request[A] => Result): Action[(Action[A], A)] = {
  Security.Authenticated(userid, onUnauthorized) { userid =>
    Action(p)(request => f(userid.toInt)(request))
  }
}

// Convenience for when you don't need a BP
def withAuth(f: => Int => Request[AnyContent] => Result): Action[(Action[AnyContent], AnyContent)] = {
  withAuth(BodyParsers.parse.anyContent)(f)
}
person Marius Soutier    schedule 04.02.2013
comment
Этот код компилируется для вас? Я использую Play 2.1, и тип возвращаемого значения не Action[A], как определено сигнатурой метода в вашем первом определении. - person Farmor; 05.02.2013
comment
Вы правы, я не понял, что Security.Authenticated по умолчанию возвращает завернутое действие. Я отредактирую соответственно. - person Marius Soutier; 05.02.2013