为 Protobuf 添加访问控制

Adding access control to Protobuf

我一直在考虑为 grpc 服务添加某种基于能力的访问控制。我的想法是为 proto 文件中定义的每个 rpc 提供所需的功能,并使用 grpc 拦截器检查用户提供的功能是否与 rpc 所需的功能相匹配。我已经查看了一些文档和教程,但对于从哪里开始我有点不知所措。非常感谢任何指导。

实现此目的的一种方法是编写一个生成器插件来解析您的原型文件,并生成某种代码或数据文件。喜欢grpc-gateway does. Each rpc have options can be customized, and added in proto file like this. Those options are called protobuf.MethodOptions. You can see this here。所以你可以有自己的方法选项并使用它生成你的验证器或修饰符,然后从拦截器调用验证器来解析。

我可以告诉你的另一种非常规方式是, 你可以有一个包含地图的 json 或 yaml 文件。每个 protobuf 方法都有一个唯一的名称标识符,格式为 "/package.service/rpcMethodName"。所以如果你有一个像这样的 rpc 方法:

syntax = "proto3";

package yourpackage;

service ServiceName {
  rpc MethodName(Request) returns (Response) {};
}

此方法的唯一标识符类似于 /yourpackage.ServiceName/MethodName,您将在拦截器中找到它,如 grpc.UnaryServerInfo.FullMethod

所以方法是通过 yaml 或 json 维护一个单独的映射,其中包含您的 FullMethodName 和所需的功能,然后在您的拦截器中读取映射并找到您的方法所需的功能,然后应用您的方法所需的操作。