假设我有这个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 {...
如果要将SecuredRequest
传递给处理函数,是的,您必须按照您的定义定义一个ActionBuilder,因为ActionBuilder所使用的决定了提供给该动作块的参数的类型。
如果操作可以返回另一个路由器,并且路由器可以对RequestHeader进行部分模式匹配,则这是一种可能的方式。