gRPC拦截器中的unmarshall请求

问题描述 投票:2回答:1

为了执行授权,将读取请求中的一些属性,以便可以进行授权服务器的输入

例如,这是拦截器。在这里,prepareAuthZInput被要求准备输入

func AuthInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
     input := prepareAuthZInput(info.FullMethod, req)
}

在这个函数中,有一个很大的if-else部分,它检查请求的实际类型,输入它,然后执行输入准备。

func prepareAuthZInput(method string, req interface{}) {
   var input Input
   if methodName = "/Data/Call" {
       callRequest, ok := req.(CallRequest)
       if ok {
          // prepare input from callRequest
       }
   } else if methodName = "/Data/Receive" {
       receiveRequest, ok := req.(ReceiveRequest)
       if ok {
          // prepare input from receiveRequest
       }

   }
   return input
}

我该如何改进这段代码?

go authorization grpc
1个回答
1
投票

在做这样的事情时,通常会将auth数据添加到metadata而不是请求消息。这样,服务器不需要检查所有可能的请求有效负载类型。

如果必须使用请求有效负载,则使用类型开关代替更为惯用:

switch r := req.(type) {
  case CallRequest: // r is a CallRequest...
  case ReceiveRequest: // r is a ReceiveRequest...
  default:
    return status.Errorf(codes.Unimplemented, "unknown request type: %T", req)
}
© www.soinside.com 2019 - 2024. All rights reserved.