3

我一直在尝试为使用 Apache Thrift 的项目添加安全性。在 C# 中,有一个类TSASLClientTransport,它接受参数 TSocket、用户名和密码。同样,我需要一个 cpp 类,以便我可以在 C++ 中实现它。

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

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

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

任何帮助是极大的赞赏。

4

1 回答 1

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));

创建回调数组以从客户端获取用户名和简单密码,并从客户端获取密码。

  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();

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

于 2016-09-24T04:47:46.757 回答