我正在开发一个使用thrift的系统。我希望检查客户端身份并对ACL进行操作。 Thrift会为那些提供任何支持吗?
答案 0 :(得分: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
的客户需要重新授权并重试,我们还有一些防火墙规则来阻止暴力攻击。
答案 1 :(得分:1)
自动化和权限等任务不被视为Thrift的一部分,主要是因为这些事情(通常)与应用程序逻辑相关,而不是与一般的RPC /序列化概念相关。 Thrift现在支持的唯一Thing是TSASLTransport
。我自己也不能说太多,只是因为我从来没有觉得有必要使用它。
另一种选择可能是使用THeaderTransport
,遗憾的是在编写本文时只使用C ++实现。因此,如果您计划将其与其他语言一起使用,则可能需要投入一些额外的工作。不用说我们接受捐款......
答案 2 :(得分: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)