此文章主要記錄部分主要的 MongoDB 的 DCL 操作。
MongoDB 默認不需要用戶名和密碼就可以用 mongodb.exe 登錄
一、開啟 MonogoDB 的權限模式
修改 MongoDB 服務的注冊語句,修改加入 --auth 參數,詳情見MongoDB 入門之安裝篇
"$MONGODB_HOME\bin\mongod.exe" --config "$MONGODB_HOME\mongo.cfg" --install --auth
C:\Windows\System32\sc.exe create MongoDB binPath= "\"$MONGODB_HOME\bin\mongod.exe\" --service --auth --config=\"$MONGODB_HOME\mongo.cfg\"" DisplayName= "MongoDB 2.6 Standard" start= "auto"
或者在mongod.cfg 中添加配置
auth=true
二、用戶權限管理
- 創建用戶
> db.addUser("user","abc123_") WARNING: The 'addUser' shell helper is DEPRECATED. Please use 'createUser' instead Successfully added user: { "user" : "user", "roles" : [ "dbOwner" ] } >
可以看到當執行 addUser 命令是出現 wraning,雖然創建成功了,但是 MongoDB 建議使用 createUser。
> db.createUser({ ... user:"user", ... pwd:"abc123_", ... roles:[ ... { ... role:"dbOwner", ... db:"mydb" ... } ... ] ... }) Successfully added user: { "user" : "user", "roles" : [ { "role" : "dbOwner", "db" : "mydb" } ] } >
如果 MongoDB 開啟了權限模式,並且某一個數據庫沒有任何用戶時,在不驗證權限的情況下,可以創建一個用戶,當繼續創建第二個用戶時,會返回錯誤,若想繼續創建用戶則必須登錄。
2014-10-16T10:40:41.904+0800 Error: couldn't add user: not authorized on mydb to execute command { createUser: "test", pwd: "xxx", roles: [ { role: "dbOwner", db: "mydb" } ], digestPassword: false, writeConcern: { w: "majority", wtimeout: 30000.0 } } at src/mongo/shell/db.js:1004 >
-
創建超級管理員
創建超級管理員需要未開啟權限模式的情況下執行。如果已開啟權限而在 admin 下創建超級管理員,會出現如下錯誤> db.createUser({ ... user:"admin", ... pwd:"admin", ... roles:[ ... { ... role:"userAdminAnyDatabase", ... db:"admin" ... } ... ] ... }) 2014-10-16T10:48:01.223+0800 Error: couldn't add user: not authorized on admin to execute command { createUser: "admin", pwd: "xxx", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ], digestPassword: false, writeConcern: { w: "majority", wtimeout: 30000.0 } } at src/mongo/shell/db.js:1004 >
關閉權限模式創建超級管理員
> use admin switched to db admin > db.createUser({ ... user:"admin", ... pwd:"admin", ... roles:[ ... { ... role:"userAdminAnyDatabase", ... db:"admin" ... } ... ] ... }) Successfully added user: { "user" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } >
如果使用 addUser 創建超級管理員還必須切換到 admin 數據庫。
- 刪除用戶
> db.dropUser("user") true >
- 登錄
anth 需要登錄用戶有該數據庫的權限
> use mydb switched to db mydb > db.auth("user","abc123_") 1 >