Авторизация засова по параметрам
Я тестирую Deadbolt в приложении Scala Play. Мои методы контроллера выглядят примерно так:
def getProject(projectId: Int) = actionBuilder.RestrictAction("user").defaultHandler() {
authRequest =>
//retrieves project
}
В этом случае я хочу, чтобы пользователь был авторизован для получения проекта, только если projectId
принадлежит этому пользователю. В других более сложных случаях используются несколько параметров как из строки запроса, так и / или из тела сообщения.
Из того, что я понимаю, подход заключается в том, чтобы передать параметры DynamicResourceHandler
а затем обрабатывает разрешения для каждого случая в отдельности. Это возможно, но я ожидал немного большей поддержки от Deadbolt для этого варианта использования. Каков наилучший подход для авторизации запроса на основе полученных параметров?
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]
Вам нужно будет использовать asInstanceOf
для meta
значение.
Для более сложных требований вы можете передать все, что вы собрали, в данные (например, класс или карту случая) как meta
аргумент.