如何在不使用finagle过滤器的情况下在finch端点上应用过滤器?

时间:2017-11-07 08:32:21

标签: finch

我有多个端点。我可以使用finagle过滤器在端点上应用通用过滤器。但是现在我想在特定端点上应用过滤器。 我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

我在玩redbubble's finch template时出现了类似的问题(基本身份验证过滤),我通过以下方式部分解决了这个问题:

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的端点,但我还没有找到一种向调用者返回错误消息的简单方法,我很想知道我是否选择了正确的道路。

答案 1 :(得分:0)

这就是我的解决方法。这可能不是理想的,但是可行。

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)

}