【发布时间】:2019-11-12 03:53:02
【问题描述】:
我们有一个 gPRC 服务,它需要在一个类的 ThreadLocal 变量中设置身份验证/身份信息,以便它正确调用另一个服务。 gPRC 服务从请求中获取身份验证/身份信息,因此我正在考虑使用拦截器。
首先,我有一些代码如下所示。
public class ImpersonationInterceptor {
public <ReqT, RespT> interceptCall(
ServerCall<ReqT, RespT> serverCall, Metadata headers, ServerCallHandler<ReqT, RespT> next) {
Principal principal = ... // get the identify from the request
AuthContext.setPrincipal(principal); // underneath it uses a ThreadLocal.
return next.startCall(
new SimpleForwardingServerCall<>(call) {
public void close(Status status, Metadata trailers) {
AuthContext.setPrincipal(null); // clear the identity
}
}
)
}
}
问题。
- 服务方法本身的执行可能不在同一个线程上执行拦截器,对吗?
- 如果为真,上述方法行不通,那么问题是,在 gRPC 世界中设置 ThreadLocal 变量的规范方法是什么?我知道 gRPC 从 0.12 开始就支持 Context,但就我而言,我必须使用 AuthContext 的 ThreadLocal 机制。
非常感谢。
【问题讨论】: