>The execution of the service method itself may not lie on the same thread 
to execute the interceptor, is that right?
Yes.

I only see you set the principal, but don't see where/in what thread you 
read the principal, so I can not give you an answer. What's not possible 
for you to achieve your goal with ThreadLocal<A 
<https://cs.corp.google.com/piper///depot/google3/java/com/google/net/base/GoogleIpTosParams.java?l=53&ct=xref_jump_to_def&gsn=GoogleIpTosParams&rcl=256078461>
tomicReference<Principal>> as below?


static final ThreadLocal<A 
<https://cs.corp.google.com/piper///depot/google3/java/com/google/net/base/GoogleIpTosParams.java?l=53&ct=xref_jump_to_def&gsn=GoogleIpTosParams&rcl=256078461>
tomicReference<Principal>> threadLocal = new ThreadLocal<>();

public <ReqT, RespT> interceptCall(
        ServerCall<ReqT, RespT> serverCall, Metadata headers, 
ServerCallHandler<ReqT, RespT> next) {
    Principal principal = ... // get the identify from the request
    final A 
<https://cs.corp.google.com/piper///depot/google3/java/com/google/net/base/GoogleIpTosParams.java?l=53&ct=xref_jump_to_def&gsn=GoogleIpTosParams&rcl=256078461>
tomicReference<Principal> principalRef = new A 
<https://cs.corp.google.com/piper///depot/google3/java/com/google/net/base/GoogleIpTosParams.java?l=53&ct=xref_jump_to_def&gsn=GoogleIpTosParams&rcl=256078461>
tomicReference<Principal>(principal);
    threadLoacal.set(principalRef);
  return next.startCall(
      new SimpleForwardingServerCall<>(call) {
          public void close(Status status, Metadata trailers) {
            principalRef.set(null); // clear the identity
          }
      },
      headers);
}




On Sunday, June 30, 2019 at 7:55:29 PM UTC-7, garlicbulb wrote:
>
> We have a gPRC service that needs to set auth/identity information in a 
> ThreadLocal variable in a class for it to correctly call another service. 
> The gPRC service gets the auth/identiy information from request so I am 
> thinking to use interceptor.
>
> To start, I have some code looking as follows.
>
> 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
>                 }
>             }
>         )
>     }
> }
>
> Questions.
>
> * The execution of the service method itself may not lie on the same 
> thread to execute the interceptor, is that right?
> * If true, the above is not gonna work, then the question is, what is the 
> canonical way to set ThreadLocal variable in gRPC world? I know gRPC has 
> Context support since 0.12, but in my case, I have to use the AuthContext's 
> ThreadLocal mechanism.
>
> Thanks very much in advance.
>
> Chen
>

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/1eab44e6-5657-4a35-9e1c-8350daab6c8c%40googlegroups.com.

Reply via email to