Как применить фильтр к конечной точке вьюрка, не используя фильтры finagle?

У меня есть несколько конечных точек. Я могу применять общие фильтры к конечным точкам, используя фильтр Finagle. Но теперь я хочу применить фильтр к определенной конечной точке. Как мне этого добиться?

2 ответа

У меня был похожий вопрос (для базовой фильтрации аутентификации), который всплыл во время игры с шаблоном вьюрка Redbubble, который я частично решил следующим образом:

class AuthenticatedEndpoint[A](e: Endpoint[A]) extends Endpoint[A] { self =>

final def apply(mapper: Mapper[A]): Endpoint[mapper.Out] = mapper(self)

final def apply(input: Input): Endpoint.Result[A] =
  if (checkSession(input.request)) {
    e(input)
  } else {
    // TODO return something meaningful to the caller (if possible?)
    EndpointResult.Skipped
  }
}

object AuthenticatedEndpoint {

  def validSession[A](e: Endpoint[A]): Endpoint[A] = new AuthenticatedEndpoint(e)

}

checkSession возвращает true, если все хорошо с запросом). Тогда мой API определяется как:

val api = "v1" :: loginApi :+: validSession(peopleApi :+: healthApi :+: adminApi)

Это хорошо работает в том смысле, что запросы без сеанса не будут иметь доступа к конечным точкам, переданным validSession, но мне еще предстоит найти простой способ вернуть сообщение об ошибке вызывающей стороне, и мне было бы интересно узнать, выбрал ли я правильный путь здесь.

Вот как я обошел это. Это, вероятно, не идеально, но работает.

class AuthenticatedEndpoint[A](e: Endpoint[A])(implicit auth: Request => Boolean) extends Endpoint[A] { self =>

  final def apply(mapper: Mapper[A]): Endpoint[mapper.Out] = mapper(self)

  final def apply(input: Input): Endpoint.Result[A] =
    if (auth(input.request)) {
      e(input)
    } else {
      EndpointResult.Matched[Nothing](input, Rerunnable( Unauthorized(new Exception(s"Authentication Failed."))) )
    }
}

object AuthenticatedEndpoint {

  def validSession[A](e: Endpoint[A]): Endpoint[A] = new AuthenticatedEndpoint(e)

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