Thrift sasl,用于C ++的用户名/密码认证

时间:2016-08-05 05:19:33

标签: authentication visual-c++ thrift sasl cyrus

我一直在尝试为使用Apache Thrift的项目添加安全性。在C#中,有一个类 TSASLClientTransport ,它接受参数TSocket,username和password。类似地,我需要一个cpp类,以便我可以在C ++中实现相同的功能。

我遇到了此任务https://issues.apache.org/jira/browse/THRIFT-1667,该任务仍处于打开状态。但是这个任务中有一个补丁。使用此补丁我导入了TsaslTransport类,但我找不到在这里提供用户名/密码的方法。如果可能的话,任何人都可以分享这方面的任何例子。

或者有没有办法在使用C ++的thrift中提供简单的用户名/密码验证?

可以在这里使用Cyrus-SASL吗?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

经过一番调查后,我发现了一个有效的解决方案。我使用了cyrus-sasl项目以及来自Apache THRIFT的补丁。

首先创建一个TTransport,其中hive服务在安全集群中运行。

boost::shared_ptr<TTransport> socket(new TSocket("hive_host", hive_port));
boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));

创建回调数组,以便在客户端中获取来自&amp; 简单的用户名和来自&amp; getsecret 的密码。

  static sasl_callback_t callbacks[] ={
           {
            SASL_CB_USER, (sasl_callback_ft)&simple, NULL 
           }, {
            SASL_CB_AUTHNAME, (sasl_callback_ft)&simple, NULL 
           }, {
            SASL_CB_PASS, (sasl_callback_ft)&getsecret, NULL
           }, {
            SASL_CB_LIST_END, NULL, NULL
           }
};

使用saslimpl.cpp中的libSaslClient选择机制和服务。这会初始化客户端。并在TSaslTransport中使用此客户端打开连接并与服务器通信。

map<string, string> props; 
sasl::libSaslClient libSaslClient("PLAIN", "", "ldap", "host", props, callbacks);
boost::shared_ptr<TSaslTransport> tsaslTransport(new TSaslTransport(&libSaslClient, transport));
tsaslTransport->open();
tsaslTransport->close();

成功打开后,您可以使用正确的用户名和密码与安全群集进行通信。