Я разрабатываю систему, которая использует бережливость. Я хотел бы проверить идентификацию клиентов и выполнить операции ACLed. Предоставляет ли Thrift какую-либо поддержку для них?
Как обрабатывать аутентификацию и авторизацию с помощью экономии?
Ответ 1
Не напрямую. Единственный способ сделать это - использовать метод проверки подлинности, который создает (временный) ключ на сервере, а затем изменить все ваши методы, чтобы первым аргументом был этот ключ, и все они дополнительно повышают ошибку, не прошедшую проверку подлинности. Например:
exception NotAuthorisedException {
1: string errorMessage,
}
exception AuthTimeoutException {
1: string errorMessage,
}
service MyAuthService {
string authenticate( 1:string user, 2:string pass )
throws ( 1:NotAuthorisedException e ),
string mymethod( 1:string authstring, 2:string otherargs, ... )
throws ( 1:AuthTimeoutException e, ... ),
}
Мы используем этот метод и сохраняем наши ключи в защищенном экземпляре memcached с 30-минутным таймаутом для ключей, чтобы все было "мгновенно". Ожидается, что клиенты, получившие AuthTimeoutException
, повторно подтвердят и повторите попытку, и у нас есть некоторые правила брандмауэра, чтобы остановить атаки грубой силы.
Ответ 2
Задачи, такие как авторизация и разрешения, не считаются частью Thrift, главным образом потому, что эти вещи (обычно) больше связаны с логикой приложения, чем с общей концепцией RPC/сериализации. Единственное, что Thrift поддерживает прямо сейчас, это TSASLTransport
. Я не могу сказать много об этом сам, просто потому, что я никогда не чувствовал необходимости использовать его.
Другим вариантом может быть использование THeaderTransport
, который, к сожалению, на момент написания, реализован только с С++. Следовательно, если вы планируете использовать его на каком-либо другом языке, вам, возможно, придется потратить дополнительную работу. Излишне говорить, что мы принимаем вклады...
Ответ 3
Немного поздно (думаю, очень поздно), но пару лет назад я модифицировал исходный код Thrift.
Просто отправил билет с патчем на https://issues.apache.org/jira/browse/THRIFT-4221 только для этого.
Посмотрите на это. В основном предложение состоит в том, чтобы добавить крюк "BeforeAction", который делает именно это.
Пример Golang сгенерированный diff
+ // Called before any other action is called
+ BeforeAction(serviceName string, actionName string, args map[string]interface{}) (err error)
+ // Called if an action returned an error
+ ProcessError(err error) error
}
type MyServiceClient struct {
@@ -391,7 +395,12 @@ func (p *myServiceProcessorMyMethod) Process(seqId int32, iprot, oprot thrift.TP
result := MyServiceMyMethodResult{}
var retval string
var err2 error
- if retval, err2 = p.handler.MyMethod(args.AuthString, args.OtherArgs_); err2 != nil {
+ err2 = p.handler.BeforeAction("MyService", "MyMethod", map[string]interface{}{"AuthString": args.AuthString, "OtherArgs_": args.OtherArgs_})
+ if err2 == nil {
+ retval, err2 = p.handler.MyMethod(args.AuthString, args.OtherArgs_)
+ }
+ if err2 != nil {
+ err2 = p.handler.ProcessError(err2)