首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用thrift处理身份验证和授权?

如何使用thrift处理身份验证和授权?
EN

Stack Overflow用户
提问于 2011-01-07 09:24:40
回答 3查看 7.1K关注 0票数 19

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-21 20:15:29

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

代码语言:javascript
运行
复制
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的客户端需要重新授权并重试,我们有一些防火墙规则来阻止暴力攻击。

票数 13
EN

Stack Overflow用户

发布于 2013-08-25 21:15:30

像授权和权限这样的任务没有被认为是Thrift的一部分,主要是因为这些东西(通常)更多地与应用程序逻辑相关,而不是一般的RPC/序列化概念。目前,Thrift唯一支持的开箱即用的就是TSASLTransport。我自己不能说太多,只是因为我从来没有觉得有必要使用它。

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

票数 3
EN

Stack Overflow用户

发布于 2017-06-03 22:01:09

有点晚了(我猜是很晚了),但我在几年前就修改了Thrift源代码。

刚刚为此向https://issues.apache.org/jira/browse/THRIFT-4221提交了一份带有补丁的工单。

看看这个。基本上,这个建议就是添加一个"BeforeAction“钩子来实现这一点。

Golang生成的diff示例

代码语言:javascript
运行
复制
+       // 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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4621715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档