MongoDB 3.0 開啟認證模式
之前有介紹過 MongoDB 2.x 開啟認證模式的方法,如果是使用新的 MongoDB 3.x,設定檔的配置方式有些不同,首先先進入資料庫,透過 db.createUser 建立使用者,如下:
use mydb; db.createUser({ user: "username", pwd: "password", roles: ["readWrite", "dbAdmin", "dbOwner"] }); exit;
roles 可以指定使用者擁有的權限,詳細的權限直可以參考官方說明。建立好使用者與密碼後,就要來開啟認證模式了,請在 /etc/mongod.conf 加入以下設定:
security: authorization: enabled
然後重新啟用 MongoDB
sudo service mongod restart
Mongo Client Sehll Command 指定認證資料庫登入
mongo -u username -p --authenticationDatabase mydb
解決 AuthenticationFailed 問題
再來就可以透過帳密來連線使用囉,實際我透過 Ubuntu Server 14.04 中的 php-mongo 套件與比較新的 MongoDB 3.2 進行連線時,一直發生問題,PHP 噴出以下 Log:
2016-03-22T15:04:26.712+0800 I ACCESS [conn240] Failed to authenticate username@mydb with mechanism MONGODB-CR: AuthenticationFailed MONGODB-CR credentials missing in the user document 2016-03-22T15:04:26.712+0800 I NETWORK [conn240] end connection 127.0.0.1:40025 (0 connections now open)
Google 了一下,發現是 MongoDB 的 Schema 比較新造成的認證問題,進入 MongoDB 將 Schema Version 由 5 改成 3,語法如下:
use admin; var schema = db.system.version.findOne({"_id" : "authSchema"}); schema.currentVersion = 3; db.system.version.save(schema);
由於以上更新 Schema 需要「__system」權限,建議可以建立一個像是 mysql 中的 root 帳號,才可以大無敵修改 admin 資料庫,如下:
db.createUser( { user: "root", pwd: "<password>", roles: [ { role: "userAdminAnyDatabase", db: "admin" }, { role: "hostManager", db: "admin" }, { role: "__system", db: "admin" } ] });
更改 Schema 之後,需要重新建立使用者喔。如下:
use mydb; db.dropAllUsers(); db.createUser({ user: "username", pwd: "password", roles: ["readWrite", "dbAdmin", "dbOwner"] }); exit;
這樣就搞定囉!Bye...