2016-08-05 5 views
3

Apache Thrift를 사용하는 프로젝트에 보안을 추가하려고했습니다. C#에는 TSocket, username 및 password 매개 변수를 허용하는 클래스 TSASLClientTransport이 있습니다. 마찬가지로 나는 C++에서 같은 것을 구현할 수 있도록 cpp 클래스가 필요하다.C++ 용 사용자 이름/비밀번호 인증을 사용하는 Thrift sasl

이 작업은 Open 상태 인 https://issues.apache.org/jira/browse/THRIFT-1667으로 나왔습니다. 이 작업에서 사용할 수있는 패치가 있습니다. 이 패치를 사용하여 TsaslTransport 클래스를 가져 왔지만 여기서 사용자 이름/암호를 제공하는 방법을 찾지 못했습니다. 가능한 경우 누구나이 예제를 공유 할 수 있습니다.

또는 C++을 사용하여 절약 할 때 간단한 사용자 이름/암호 인증을 제공하는 방법이 있습니까?

여기에 Cyrus-SASL을 사용할 수 있습니까?

도움을 주시면 대단히 감사하겠습니다.

답변

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

클라이언트 & 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(); 

성공적으로 열리면 올바른 사용자 이름과 암호로 보안 클러스터와 통신 할 수 있습니다.