我一直在考虑为 grpc 服务添加某种基于能力的访问控制。我的想法是为 proto 文件中定义的每个 rpc 提供所需的功能,并使用 grpc 拦截器检查用户提供的功能是否与 rpc 所需的功能相匹配。我已经查看了几个文档和教程,但是对于从哪里开始我有点茫然。将不胜感激任何指导。
问问题
576 次
1 回答
2
实现此目的的一种方法是编写一个生成器插件,该插件将解析您的 proto 文件,并生成某种代码或数据文件。就像grpc-gateway一样。每个 rpc 都有可以自定义的选项,并像这样添加到 proto 文件中。这些选项称为 protobuf.MethodOptions。你可以在这里看到这个。因此,您可以拥有自己的方法选项并使用它生成您的验证器或修饰符,然后从拦截器调用验证器进行解析。
我可以告诉您的另一种非常规方式是,您可以拥有一个包含地图的 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 和所需的功能,然后在您的拦截器中读取映射并为您的方法找到所需的功能,并应用您所需的操作。
于 2016-09-02T04:47:56.817 回答