Авторизация засова по параметрам

Я тестирую 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 аргумент.

Другие вопросы по тегам