问题描述
服务器应用程序支持身份验证,该身份验证要求与其连接的客户端提供用户名和密码。机器内部也可能有一个我不希望对其进行身份验证的客户端。同一台计算机上的客户端使用LOOPBACK地址与服务器连接。我想要的是,如果我能以某种方式为gRPC连接的目标IP应用过滤器,并决定是否应用身份验证。有办法吗?谢谢!
func (s *RShellServer) ExecCmd(stream RShell_ExecCmdserver) error {
# For example,something like this if condition.
if (Conn().destination_ip != LOOPBACK) {
if err,ok := gnmi.AuthorizeUser(stream.Context()); !ok {
return fmt.Errorf("%s",err)
}
}
req,err := stream.Recv()
if err != nil {
return fmt.Errorf("Error reading request: %s",err)
}
}
解决方法
您的GRPC服务应该是这样的
func (MyServer) SomeFunction(ctx context.Context,req *myserver.Request) (resp *myserver.Response,err error)
然后,您可以使用对等库并从`
之类的上下文中提取对等信息。p,err := peer.FromContext(ctx)
并使用
从对等方获取地址p.Addr