19

我正在开发一个使用节俭的系统。我希望检查客户身份并进行 ACL 操作。Thrift 是否为这些提供任何支持?

4

3 回答 3

13

不是直接的。做到这一点的唯一方法是使用一种在服务器上创建(临时)密钥的身份验证方法,然后更改所有方法,以便第一个参数是此密钥,并且它们都会另外引发未经身份验证的错误。例如:

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应该重新授权并重试,我们有一些防火墙规则来阻止暴力攻击。

于 2011-01-21T12:15:29.337 回答
3

自动化和权限等任务不被视为 Thrift 的一部分,主要是因为这些事情(通常)与应用程序逻辑相关,而不是与一般 RPC/序列化概念相关。Thrift 目前唯一支持开箱即用的是TSASLTransport. 我自己不能说太多关于那个,只是因为我从来没有觉得有必要使用它。

另一种选择可能是使用THeaderTransport它,不幸的是,在撰写本文时仅使用 C++ 实现。因此,如果您打算将它与其他语言一起使用,您可能需要投入一些额外的工作。不用说,我们接受捐款......

于 2013-08-25T13:15:29.743 回答
0

有点晚了(我想很晚了),但几年前我已经为此修改了 Thrift 源代码。

为此,只需将带有补丁的票证提交到https://issues.apache.org/jira/browse/THRIFT-4221

看看那个。基本上,该提议是添加一个“BeforeAction”钩子来实现这一点。

示例 Golang 生成的差异

+       // 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)
于 2017-06-03T14:01:08.947 回答