我一直在考虑为grpc服务添加某种基于功能的访问控制。我的想法是为proto文件中定义的每个rpc提供所需的功能,并使用grpc拦截器检查用户提供的功能是否与rpc所需的功能相匹配。我已经查看了几个文档和教程,但我对从哪里开始有点不知所措。非常感谢任何指导。
答案 0 :(得分:2)
一种方法是实现这一点,即编写一个生成器插件,它将解析你的proto文件,并生成某种代码或数据文件。就像grpc-gateway一样。每个rpc都有自定义选项,并添加到原始文件中,如this。这些选项称为protobuf.MethodOptions。你可以看到这个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和所需的能力,然后你的拦截器内部读取地图并找到所需的方法功能,并应用你想要的操作。