Как заблокировать разбор тела? - PullRequest
1 голос
/ 05 июля 2019

Я написал собственный анализатор тела, похожий на описанный в документах , и тип защиты ActionRefiner, который либо преобразуется в мой UserRequest, либо возвращает ошибку:

val userRefiner = new ActionRefiner[Request, UserRequest] {
  override protected def refine[A](request: Request[A]) = ???
  override protected def executionContext = ???
}

def roleFilter(role: Role) = new ActionFilter[UserRequest] {
  override protected def filter[A](request: UserRequest[A]) = ???
  override protected def executionContext = ???
}

def UserAction(role: Role): ActionBuilder[UserRequest, AnyContent] = {
  deps.cc.actionBuilder.andThen(userRefiner).andThen(roleFilter(role))
}

Использование:

UserAction(Role.User)(customBodyParser) { implicit request => ... }

Проблема, с которой я столкнулся, заключается в том, что анализатор тела выполняется перед ActionRefiner, поэтому я по сути обрабатываю запрос, прежде чем отклонить его.

Как правильно обработать этот запрос??Мне нужен какой-то ActionTransformer, который использует только заголовки HTTP, а не тело

1 Ответ

0 голосов
/ 05 июля 2019

Попробуйте определить отдельное действие аутентификации, которое игнорирует тело, используя BodyParsers.utils.ignore, а затем скомпоновать его с дальнейшими действиями, которые должны выполняться после аутентификации. Возможно, что-то вроде этого

class Auth @Inject()(val parser: BodyParser[AnyContent] = BodyParsers.utils.ignore(AnyContentAsEmpty: AnyContent))(implicit val executionContext: ExecutionContext)
    extends ActionBuilder[Request, AnyContent]
    with ActionFilter[Request] {

  def filter[A](request: Request[A]) = Future.successful {
    if (/* check request.headers */)
      Some(Forbidden)
    else
      None
  }
}

val userAction = DefaultActionBuilder(controllerComponents.parsers.anyContent) andThen (new Auth(BodyParsers.utils.ignore(AnyContentAsEmpty: AnyContent))) andThen ...

def someRoute = userAction { implicit request => ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...