【发布时间】:2023-03-30 00:30:01
【问题描述】:
我有一个 GRPC 服务器,其 API 已获得以下授权:
func (s *MyServer) MyAPI(ctx context.Context, req MyAPIRequest) (MyAPIResponse, error) {
isAuthorized, err = s.IsAuthorized(ctx, req.UserId, Role.User) // other APIs may use a different authorization function than IsAuthorized
if err != nil {
return nil, err
}
if !isAuthorized {
return nil, status.Error(codes.PermissionDenied, "not authorized")
}
// rest of API code
}
我想知道如何:
- 简化授权逻辑的使用,例如注释。我更熟悉 Java,它就像函数上方的
@Authorize(ctx = ctx, req = req, role = Role.User)。 - 需要对 API 进行授权检查,以便在至少一个 API 缺少授权时构建失败。我正在使用巴泽尔。请注意,并非所有
func (s *MyServer)都是 API。
这是我的想法:
- 。
- 使用授权规则的方法名称键值对创建一个 YAML 文件。例如
MyAPI: IsUserIdAuthorizedAsUser将转换为s.IsAuthorized(ctx, req.UserId, Role.User)。 - 创建一个拦截器,为请求的方法名称查找 authz 规则并调用相应的 authz 函数。
- 使用授权规则的方法名称键值对创建一个 YAML 文件。例如
- 有一个 bazel 构建规则来解析
rpc的 proto 文件,这些都是 API 方法名称,如果不是所有这些都在规则列表中,则会失败。我还不知道该怎么做。
如果对我的想法或更好的方法提出任何建议,将不胜感激。
【问题讨论】:
标签: go annotations authorization grpc grpc-go