Site icon Soul & Shell Blog

MongoDB 3.0 開啟連線認證功能(筆記)

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...

Exit mobile version