Подтвердить что ты не робот

Как обрабатывать аутентификацию и авторизацию с помощью экономии?

Я разрабатываю систему, которая использует бережливость. Я хотел бы проверить идентификацию клиентов и выполнить операции ACLed. Предоставляет ли Thrift какую-либо поддержку для них?

4b9b3361

Ответ 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)