mongodb3.03開啟認證

塗宗勳發表於2015-08-10

原文地址:http://21jhf.iteye.com/blog/2216103

下載了最新mongodb3.03版本,當使用–auth 引數命令列開啟mongodb使用者認證時遇到很多問題,現總結如下: 

(百度上搜到的基本都是老版本的,看到db.addUser的就是,請忽略) 
Windows下我做了一個bat檔案,用來啟動mongodb,命令列如下: 
mongod –dbpath dbdata –port 27017 –directoryperdb –logpath dblogsmongodb.log –logappend –auth 
最後的引數就是開啟和關閉認證,如果是conf配置檔案,應該是auth=true或false 
1,首先關閉認證,也就是不帶–auth引數,啟動mongodb 
2,使用命令列進入mongodb目錄,輸入mongo命令,預設進入test資料庫 
3,use userdb  切換到自己的資料庫,輸入db,顯示userdb 
4,建立使用者,角色為dbOwner,資料庫為userdb,命令列應該是db.createUser({user:`myuser`,pwd:`123456`,roles:[{role:`dbOwner`,db:`userdb`}]}) 
5,切換到admin資料庫,use admin,db ,顯示admin,db.shutdownServer()關閉伺服器,填上認證引數,啟動mongodb;以前的版本此時使用mongovue就可以使用myuser登入到userdb資料庫上了,但是3.0.3版本不行,開啟mongodb.log檔案發現如下錯誤 

authenticate db: userdb { authenticate: 1, nonce: “xxx”, user: “myuser”, key: “xxx” } 
2015-06-02T09:57:18.877+0800 I ACCESS   [conn2] Failed to authenticate myuser@userdb with mechanism MONGODB-CR: AuthenticationFailed MONGODB-CR credentials
missing in the user document 



此1-5步驟針對是3.0.3以前版本已經ok,如果是3.0.3,mongodb加入了SCRAM-SHA-1校驗方式,需要第三方工具配合進行驗證,下面給出具體解決辦法: 
首先關閉認證,修改system.version文件裡面的authSchema版本為3,初始安裝時候應該是5,命令列如下: 
> use admin 
switched to db admin 
>  var schema = db.system.version.findOne({“_id” : “authSchema”}) 
> schema.currentVersion = 3 

> db.system.version.save(schema) 
WriteResult({ “nMatched” : 1, “nUpserted” : 0, “nModified” : 1 }) 

不過如果你現在開啟認證,仍然會提示AuthenticationFailed MONGODB-CR credentials missing in the user document 
原因是原來建立的使用者已經使用了SCRAM-SHA-1認證方式 
> use admin 
switched to db admin 
> db.system.users.find() 
[…] 
{ “_id” : “userdb.myuser”, “user” : “myuser”, “db” : “userdb”, “credentials” : { “SCRAM-SHA-1
: { “iterationCount” : 10000, “salt” : “XXXXXXXXXXXXXXXXXXXXXXXX”, “storedKey” : “XXXXXXXXXXXXXXXXXXXXXXXXXXX”, “serverKey” : “XXXXXXXXXXXXXXXXXXXXXXXXXXX” } }, “roles” : [ { “role” : “dbOwner”, “db” : “userdb” } ] } 


解決方式就是刪除剛剛建立的使用者,重新重建即可: 
> use userdb 
switched to db userdb 
> db.dropUser(“myuser”) 
true 
>db.createUser({user:`myuser`,pwd:`123456`,roles:[{role:`dbOwner`,db:`userdb`}]}) 
然後關閉伺服器,開啟認證,重啟伺服器,用mongovue連線,一切OK 


相關文章