Добавление контроля доступа в Protobuf
Я думал о добавлении какого-то контроля доступа на основе возможностей к сервисам grpc. Моя идея состояла в том, чтобы иметь обязательную возможность для каждого rpc, определенного в файле proto, и использовать перехватчики grpc, чтобы проверить, соответствует ли предоставленная пользователем возможность той, которая требуется для rpc. Я просмотрел несколько документов и учебных пособий, но я немного растерялся относительно того, с чего начать. Буду признателен за любые рекомендации.
1 ответ
Одним из способов достижения этой цели является написание модуля генератора, который будет анализировать ваш файл прото и генерировать некоторый код или файл данных. Как это делает grpc-gateway. Каждый RPC имеет параметры, которые можно настроить, и добавить в файл протора, как это. Эти параметры называются 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 и требуемую возможность, затем внутри вашего перехватчика прочитайте карту и найдите нужную возможность для вашего метода и примените нужные операции.