2016-08-05 69 views
3

我一直在尝试将安全性添加到使用Apache Thrift的项目中。在C#中,有一个类TSASLClientTransport它接受参数TSocket,用户名和密码。同样,我需要一个cpp类,以便我可以在C++中实现相同的功能。用C + +用户名/密码认证的节俭sasl

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

或者有没有一种方法可以在使用C++的节俭中提供简单的用户名/密码认证?

可以使用Cyrus-SASL吗?

任何帮助,非常感谢。

回答

0

经过一番调查,我找到了一个工作解决方案。我已经使用cyrus-sasl项目以及来自Apache THRIFT的补丁。

首先创建TTransport,并在安全集群中运行配置单元服务。

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

创建回调数组从客户端& 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(); 

成功打开后,您将能够使用给定正确用户名和密码的安全群集进行通信。