2017-01-26 9 views
0

Я тестирую Deadbolt в приложении Scala Play. Мои методы контроллера выглядеть примерно так:Разрешение на Deadbolt на основе параметров

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.

Для более сложных требований вы можете передать все собранные вами данные (например, класс case или map) в качестве аргумента meta.

+0

Спасибо за ответ. Это было похоже на то, как я думал сделать это. Я также читал об использовании deadbolt в маршрутах вместо контроллера, но я думаю, мне было бы труднее получить доступ к значениям параметров там правильно? – nmat

+0

Действительно - в маршрутах вы можете только жестко закодировать мета. Кроме того, вы можете самостоятельно проанализировать URL-адрес, чтобы получить значение, но это уже становится довольно тяжелым. –

Смежные вопросы