3

Apache Thrift を使用するプロジェクトにセキュリティを追加しようとしています。C# には、パラメーター TSocket、ユーザー名、およびパスワードを受け入れるクラスTSASLClientTransportがあります。同様に、C++ で同じものを実装できるように、cpp クラスが必要です。

まだオープン状態にあるこのタスクhttps://issues.apache.org/jira/browse/THRIFT-1667に出くわしました。ただし、このタスクには利用可能なパッチがあります。このパッチを使用して TsaslTransport クラスをインポートしましたが、ここでユーザー名/パスワードを提供する方法が見つかりません。可能であれば、誰でもこれに関する例を共有できます。

または、C++ を使用して倹約で単純なユーザー名/パスワード認証を提供する方法はありますか?

ここでCyrus-SASLを使用できますか?

どんな助けでも大歓迎です。

4

1 に答える 1

0

いくつかの調査の後、私は実用的な解決策を見つけました。Apache THRIFTのパッチとともにcyrus-saslプロジェクトを使用しました。

最初に、安全なクラスタで実行されているハイブ サービスを含む TTransport を作成します。

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

& simpleからユーザー名を取得し、クライアントで & 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();

正常に開くと、正しいユーザー名とパスワードがあれば、安全なクラスターと通信できます。

于 2016-09-24T04:47:46.757 に答える