2014-07-11 25 views
0

我需要使用mongo java驅動程序執行copydb操作。這是我的代碼使用mongo java驅動程序複製數據庫操作啓用身份驗證時

String nonce = mongo.getDB("admin").command(new BasicDBObject("copydbgetnonce","1")).get("nonce").toString(); 
String username = "admin"; 
String password = "password"; 
String key = md5(nonce + username + md5(username + ":mongo:" + password)); 

DBObject copyOp = new BasicDBObject("copydb", "1"). 
    append("fromdb" , "db1"). 
    append("todb" , "db2"). 
    append("username" , username). 
    append("nonce" , nonce). 
    append("key" , key); 

mongo.getDB("admin").command(copyOp); 

它在服務器上禁用身份驗證時正在工作。通過身份驗證,它會導致未授權的結果。

{ "serverUsed" : "localhost/127.0.0.1:27017" , "ok" : 0.0 , "errmsg" : "unauthorized"} 

我可以保證密碼和用戶名是正確的。請指出我正確的方向。

PS我的mongod實例tokumx 1.5

感謝。

回答

1

這是否適合您?

final DBObject cmd = new BasicDBObject(); 
cmd.put("copydb", "1"); 
cmd.put("slaveOk", true); 
cmd.put("fromdb", "db1"); 
cmd.put("todb", "db2"); 
cmd.put("fromhost", "fromHost"); 

BasicDBObject nonceCmd = new BasicDBObject(); 
nonceCmd.put("copydbgetnonce", 1); 
nonceCmd.put("fromhost", "fromHost"); 
final CommandResult nonceResult = mongo.getDB("admin").command(nonceCmd); 
final String nonce = nonceResult.getString("nonce"); 
final byte[ ] innerHex =(getUserName() + ":mongo:" + String.valueOf(getPassword())).getBytes(); 
final byte[ ] outerHex = (nonce + getUserName() + Util.hexMD5(innerHex)).getBytes(); 

cmd.put("username", getUserName()); 
cmd.put("nonce", nonce); 
cmd.put("key", Util.hexMD5(outerHex)); 

final CommandResult res = mongo.getDB("admin").command(cmd); 
if (!res.ok()) 
{ 
    throw res.getException() ; 
} 
+0

您是接聽還是確認? –

+0

應該是排序的答案 – Andreas

相關問題