为了执行授权,将读取请求中的某些属性,以便可以输入授权服务器
例如,这是拦截器。在这里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
}
如何改进此代码?
答案 0 :(得分: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)
}