今天沒事跑去MongoDB的官方網站逛了下,發現有新的版本,於是就決定將開發環境下的mongodb-2.4.7直接升級到最新版本2.6.5版本。升級倒是異常快速,但使用客戶端登錄的時候就傻眼了,賬號、密碼都正確,就是死活登錄不了。我用的是MongoVUE 1.6.9,報錯如下:
再看看mongoDb的日誌,的確是報異常了:
2014-11-07T21:06:44.749+0800 [initandlisten] connection accepted from 127.0.0.1:9374 #4 (1 connection now open)
2014-11-07T21:06:44.750+0800 [conn4] authenticate db: kayo { authenticate: 1, user: "root", nonce: "xxx", key: "xxx" }
2014-11-07T21:06:44.750+0800 [conn4] Failed to authenticate root@kayo with mechanism MONGODB-CR: AuthenticationFailed UserNotFound Could not find user root@kayo
2014-11-07T21:06:44.751+0800 [conn4] end connection 127.0.0.1:9374 (0 connections now open)
出現這個錯誤,在官方文檔也找到了解釋,原來在2.6版本做了很大的改進,其改進涉及到核心、存儲、網絡、查詢和安全性等多方面,自然,其用戶登錄認證機制也發生了改變,db.system.users的schema也是是不同的,並且還增加了權限role的支持。
好吧,那麼就動手解決這個問題吧!因爲數據庫啓用了--auth,所以必須先去掉--auth參數,把數據庫重啓一遍,創建一個mongDB的系統管理員賬號,系統管理員賬號創建好後,再加上--auth參數重啓。創建mongDB系統管理員賬號的操作如下:
> use admin
> db.createUser(
{
user: "admin",
pwd: "123456",
roles:
[
{
role: "userAdminAnyDatabase",
db: "admin"
}
]
}
)
加上--auth參數重啓後,以剛纔創建的admin用戶登錄:
> mongo
> use admin
> db.auth("admin", "123456")
1
查看賬號admin的用戶信息與權限:
db.runCommand(
{
usersInfo:"admin",
showPrivileges:true
}
)
接下來就是重點了,我的目標數據庫是kayo,現在是該數據庫無法登錄,所以要爲kayo數據庫創建一個賬號,並指定dbOwner權限,操作如下:
> use kayo
> db.createUser(
{
"user": "root",
"pwd": "123456",
"roles":[
{
"role": "dbOwner",
"db": "kayo"
}
]
}
)
關於mongoDB權限,可以查看官方文檔:http://docs.mongodb.org/manual/reference/built-in-roles/
創建用戶之後,就可以正常登錄了。遇到問題,還是多看官方文檔,有時候百度真的不管用
擴展MongoDB數據庫超級管理員(2016-5-3 11:00:49)
項目做多了,創建的數據庫也多了,還得爲每個數據庫要創建一個數據庫連接,極爲不方便:
於是萌生一個想法,想創建一個類似於MySQL數據庫那樣的root用戶,可以管理讀寫所有的Mongo數據庫。前面已經講到過在admin數據庫裏創建了一個admin用戶,但這個用戶的權限是有限的,該用戶僅限於“userAdminAnyDatabase”角色,下面就來熟悉下mongoDB內置的管理全部數據的角色。
- readAnyDatabase:在admin數據庫下建立,可以讀取所有數據庫的信息
- readWriteAnyDatabase:在admin數據庫下建立,可以讀寫所有數據庫的信息
- userAdminAnyDatabase:在admin數據庫下建立,可以管理所有數據庫的用戶
- dbAdminAnyDatabase:在admin數據庫下建立,可以管理所有數據庫的信息(類似於所有數據庫的dbAdmin賬戶)
要讓admin用戶能夠讀寫所有數據庫,則需要做如下授權:
> use admin
> db.grantRolesToUser("admin", [{ role: "readWriteAnyDatabase", db: "admin" }])
取消授權的命令如下:
db.revokeRolesFromUser("<username>", [{ role: "<role-name>", db: "<db-name>"}])