0

我正在 Scala Play 应用程序中测试 Deadbolt。我的控制器方法如下所示:

def getProject(projectId: Int) = actionBuilder.RestrictAction("user").defaultHandler()  {
    authRequest =>
    //retrieves project
}

projectId在这种情况下,如果属于该用户,我只希望用户被授权获取项目。其他更复杂的情况涉及来自查询字符串和/或帖子正文的多个参数。

据我了解,这里的方法是将参数传递给 a DynamicResourceHandler,然后分别处理每种情况的权限。这是可行的,但我期待 Deadbolt 为这个用例提供更多支持。根据收到的参数授权请求的最佳方法是什么?

4

1 回答 1

1

Deadbolt 保持相当中立,以避免强迫开发人员采用特定样式,但在这种情况下,您可以使用meta参数将信息传递给约束。定义是

  object DynamicAction {

    def apply(name: String, meta: Option[Any] = None): DynamicAction.DynamicActionBuilder = DynamicActionBuilder(name, meta)

    case class DynamicActionBuilder(name: String, meta: Option[Any] = None) extends DeadboltActionBuilder {

      override def apply[A](bodyParser: BodyParser[A])(block: AuthenticatedRequest[A] => Future[Result])(implicit handler: DeadboltHandler) : Action[A] =
        deadboltActions.Dynamic(name, meta, handler)(bodyParser)(block)
    }
  }

所以你的控制器功能看起来像这样

def getProject(projectId: Int) = actionBuilder.DynamicAction(name = "checkProject", meta = Some(projectId)).defaultHandler()  {
    authRequest =>
    //retrieves project
}

这将得到一个DynamicResourceHandler(我开始讨厌这个名字,我可能会在未来的某个版本中更改它)并调用你对这个函数的实现

  def isAllowed[A](name: String,
                   meta: Option[Any] = None,
                   deadboltHandler: DeadboltHandler,
                   request: AuthenticatedRequest[A]): Future[Boolean]

您将需要使用asInstanceOfmeta值。

对于更复杂的需求,您可以将您已将数据组装到(例如案例类或映射)中的任何内容作为meta参数传递。

于 2017-01-26T08:46:45.103 回答