2017-02-02

[筆記] 將MongoDB加入登入機制

NoSQL最常見的就是MongoDB,不過預設裝好之後,是沒有任何保護機制的,也就是只要開啟mongo之後,就可以隨意操作資料庫。這在本機開發環境當然是沒關係,但正式上線後還這樣的話就有點危險啦~所以我們要加入帳號登入機制以保護我們的資料才行。

目前MongoDB的版號是3.4.1,加入使用者的機制跟之前的有些不同,db.addUser()這個function已經不能用了,取而代之的是db.createUser()。

底下將以新增一個root帳號(超級使用者,可管理操作所有資料庫),和一個db使用者(僅可操作授權的資料庫)來說明:

1. 首先啟用mongod
mongod --dbpath=YOURDBPATH --logpath=YOURLOGFILEPATH

2. 進入mongo shell,進行底下操作新增root使用者
mongo
>use admin
>db.createUser(
    {
        user: "root",
        pwd: "YOURPASSWORD",
        roles: [{ role: "root", db: "admin" }]
    })

3. 這樣我們就有了一個root管理員帳號,接著我們再來新增資料庫專屬的帳號,假設我們的資料庫名稱叫做test,新增一個testAdmin的帳號,有讀取/寫入的權限,以及testUser的帳號,僅有唯讀的權限
>use test
>db.createUser({
    user: "testAdmin",
    pwd: "PASSWORD",
    roles: [{ role: "readWrite", db: "test" }]
})
>db.createUser({
    user: "testUser",
    pwd: "PASSWORD",
    roles: [{ role: "read", db: "test" }]
})

4. 帳號建立好之後,就重新啟動mongod,並加入--auth參數,表示要啟用帳號認證機制
mongod --auth --dbpath=YOURDBPATH --logpath=YOURLOGFILEPATH

啟用認證之後,如果沒有登入的話,就會看到底下錯誤畫面:

要登入的話,看是要登入root帳號,或是資料庫獨立帳號。若是root帳號,請輸入底下:
>use admin
>db.auth("root", "PASSWORD")

若是資料庫帳號,請先use該帳號有權限的db,再行登入:
>use test
>db.auth("testAdmin", "PASSWORD")

這樣就可以囉~
MongoDB的帳號,還可以針對多個資料庫進行不同的權限處理,看到roles那個欄位是用陣列表示了嗎?表示可以對多個db做不同的權限處理喔!!詳細的資訊就請看底下的參考資料啦~

補充:
MongoDB在windows底下裝好,每次都要開cmd來啟動mongod,很煩吧?我們只要用底下指令就可以讓她註冊成windows service,這樣開機就會自動啟動囉!
mongod --port=xxxxx --install

要注意的是,上面所有的參數都會一同註冊到service內,每次啟動service都會用相同的參數,所以務必仔細確認有無漏掉或是打錯。如果要修改啟動參數的話,就必須先用底下指令移除service,重新註冊修改參數後的命令才行。
mongod --remove


參考資料:
https://docs.mongodb.com/manual/tutorial/enable-authentication/
https://docs.mongodb.com/manual/tutorial/create-users/