15

今日、Play アプリケーションを 2.5 から 2.6 にアップグレードしましたが、ActionBuilder で問題が発生しました。ドキュメントの状態:

Scala ActionBuilder トレイトが変更され、ボディの型を型パラメーターとして指定し、抽象パーサー メンバーをデフォルトのボディ パーサーとして追加しました。ActionBuilders を変更し、body パーサーを直接渡す必要があります。

ドキュメンテーション

悲しいことに、私は例を見つけられず、それを修正する方法がわかりません:

class AuthenticatedRequest[A](val token: ProfileTokenData, request: Request[A]) extends WrappedRequest[A](request)

trait Secured {

  object SetExtractor {
    def unapplySeq[T](s: Set[T]): Option[Seq[T]] = Some(s.toSeq)
  }

  def Authenticated = new ActionBuilder[AuthenticatedRequest] with JWTTokenProcess {
    override def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[Result]): Future[Result] = {
      request.jwtSession.claimData.asOpt[JWTToken] match {
        case Some(token) => block(new AuthenticatedRequest(ProfileTokenData(null, token.sub, AuthRole.None), request)).map(_.refreshJwtSession(request))
        case _ => Future.successful(Unauthorized)
      }
    }
  }

  def Registered = new ActionBuilder[AuthenticatedRequest] with JWTTokenProcess {
    override def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[Result]): Future[Result] =
      this.processJWTToken(request, block, Seq(AuthRole.Admin, AuthRole.Customer, AuthRole.Registered))
  }

  def Customer = new ActionBuilder[AuthenticatedRequest] with JWTTokenProcess {
    override def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[Result]): Future[Result] =
      this.processJWTToken(request, block, Seq(AuthRole.Admin, AuthRole.Customer))
  }

  def Admin = new ActionBuilder[AuthenticatedRequest] with JWTTokenProcess {
    override def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[Result]): Future[Result] =
      this.processJWTToken(request, block, Seq(AuthRole.Admin))
  }

}

2 番目の引数として渡さなければならない BodyParser を知っている人はいますか?

4

2 に答える 2

3

私は同じ問題を抱えています。Play 2.6.x では、BodyParser を注入して ActionBuilder を拡張する必要があります。この方法で試すこともできます

     class SecuredActionBuilder(val parser: BodyParser[AnyContent])(implicit val executionContext: ExecutionContext) extends ActionBuilder[SecuredRequest, AnyContent] {
 def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[Result]): Future[Result] = {
  request.jwtSession.claimData.asOpt[JWTToken] match {
   ...
  }
}
于 2017-08-29T11:50:01.843 に答える