如何将动作细化程序应用于发送到SIRD路由器的所有请求?

问题描述 投票:0回答:2

假设我有这个SIRD路由器:

val adminRouter = Router.from {
  case GET(p"/posts") =>
    Action { implicit request =>
      ...
    }
}

以及此动作优化程序:

object NameSpace {
  class SecuredRequest[A](val username: String, request: Request[A]) extends WrappedRequest[A](request)

  def securedAction(implicit ec: ExecutionContext) = new ActionRefiner[Request, SecuredRequest] {
    def executionContext: ExecutionContext = ec

    def refine[A](request: Request[A]): Future[Either[Result, SecuredRequest[A]]] = {
      val username = request.session.get("username")

      if (username.isDefined)
        Future.successful(Right(new SecuredRequest(username.get, request)))
      else
        Future.successful(Left(Results.Redirect(controllers.routes.AuthController.signInUser())))
    }
  }
}

然后在我的conf/routes文件中,我有这个

->   /admin   adminRouter

我想要在发送到securedAction的所有请求之前将adminRouter 动作细化器]应用到它们。因此,adminRouter仅假设所有请求都能成功到达他,那么它们都将具有username字段。

我必须创建一个SecuredAction 动作生成器

并使用它来创建这样的动作吗?
case GET(p"/posts") =>
  SecuredAction { implicit request =>
    ...
  }

假设我有这个SIRD路由器:val adminRouter = Router.from {case GET(p“ / posts”)=>动作{隐式请求=> ...}}然后是这个动作优化程序:object NameSpace {...

scala playframework routing
2个回答
1
投票

如果要将SecuredRequest传递给处理函数,是的,您必须按照您的定义定义一个ActionBuilder,因为ActionBuilder所使用的决定了提供给该动作块的参数的类型。


0
投票

如果操作可以返回另一个路由器,并且路由器可以对RequestHeader进行部分模式匹配,则这是一种可能的方式。

© www.soinside.com 2019 - 2024. All rights reserved.