基于参数的死锁授权
Deadbolt authorization based on parameters
我正在 Scala Play 应用程序中测试 Deadbolt。我的控制器方法看起来像这样:
def getProject(projectId: Int) = actionBuilder.RestrictAction("user").defaultHandler() {
authRequest =>
//retrieves project
}
在这种情况下,我只希望如果 projectId
属于该用户,则该用户有权获得该项目。其他更复杂的情况涉及来自查询字符串 and/or 和 post 主体的多个参数。
据我了解,这里的方法是将参数传递给 DynamicResourceHandler
,然后分别处理每个案例的权限。这是可行的,但我期待 Deadbolt 为这个用例提供更多支持。根据收到的参数授权请求的最佳方法是什么?
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]
您需要使用 asInstanceOf
作为 meta
值。
对于更复杂的要求,您可以将任何已组装的数据(例如案例 class 或映射)作为 meta
参数传递。
我正在 Scala Play 应用程序中测试 Deadbolt。我的控制器方法看起来像这样:
def getProject(projectId: Int) = actionBuilder.RestrictAction("user").defaultHandler() {
authRequest =>
//retrieves project
}
在这种情况下,我只希望如果 projectId
属于该用户,则该用户有权获得该项目。其他更复杂的情况涉及来自查询字符串 and/or 和 post 主体的多个参数。
据我了解,这里的方法是将参数传递给 DynamicResourceHandler
,然后分别处理每个案例的权限。这是可行的,但我期待 Deadbolt 为这个用例提供更多支持。根据收到的参数授权请求的最佳方法是什么?
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]
您需要使用 asInstanceOf
作为 meta
值。
对于更复杂的要求,您可以将任何已组装的数据(例如案例 class 或映射)作为 meta
参数传递。