2017-05-07 3 views
11

Ich habe meine Play-Anwendung von 2.5 auf 2.6 aktualisiert und ich habe ein Problem mit ActionBuilder. Der Status der Dokumentation:Spielen 2.6 ActionBuilder

Die Scala ActionBuilder-Eigenschaft wurde geändert, um den Typ des Bodys als Typparameter anzugeben, und ein abstraktes Parser-Member als Standard-Body-Parser hinzuzufügen. Sie müssen Ihre ActionBuilder ändern und den Body Parser direkt übergeben.

documentation

Leider habe ich kein Beispiel gefunden, und ich weiß nicht, wie das beheben:

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

} 

Kennt jemand whic BodyParser i als zweites Argument übergeben müssen?

Antwort

10

Hatte ein ähnliches Problem. Play 2.6 injiziert eine ControllerComponents, die einen Standard-Body-Parser hat. Vielleicht hilft das:

class CheckApiKey(apiKeyToCheck: String, cc: ControllerComponents) 
    extends ActionBuilder[Request, AnyContent] with ActionFilter[Request] { 
    ... 
    override protected def executionContext: ExecutionContext = cc.executionContext 
    override def parser: BodyParser[AnyContent] = cc.parsers.defaultBodyParser 
} 
0

Ich habe das gleiche Problem. In Play 2.6.x müssen Sie BodyParser injizieren und ActionBuilder erweitern. Sie können es auch so versuchen

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