我有多个端点。我可以使用 finagle 过滤器在端点上应用通用过滤器。但现在我想在特定端点上应用过滤器。我怎样才能做到这一点?
问问题
282 次
2 回答
3
我在玩redbubble 的 finch 模板时出现了一个类似的问题(用于基本身份验证过滤),我通过以下方式部分解决了这个问题:
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
,但是我还没有找到一种简单的方法来向调用者返回错误消息,我很想知道我是否在这里选择了正确的道路。
于 2017-11-13T11:22:44.407 回答
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)
}
于 2018-10-30T13:50:35.807 回答