-
<span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);">MongoDB 3.2 配置 用戶認證 和 角色總結</span>
1安裝 MongoDB 3.2
官網上詳細的流程走走就ok
https://docs.mongodb.com/master/tutorial/install-mongodb-on-ubuntu
2MongoDB 如果不配置登陸的情況是等於遊客也是超級管理員的,但默認不支持外鏈接的
3基本的角色
userAdminAnyDatabase 這個角色擁有分配角色和用戶的權限,但沒有查寫的缺陷
root 這是超級管理員
readWrite 有讀寫權限
read 有讀權限
-
root@iZ28ec5minyZ:~# mongo
-
MongoDB shell version: 3.2.6
-
connecting to: test
-
Server has startup warnings:
-
2016-06-04T18:43:48.721+0800 I CONTROL [initandlisten]
-
2016-06-04T18:43:48.722+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
-
2016-06-04T18:43:48.722+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
-
2016-06-04T18:43:48.722+0800 I CONTROL [initandlisten]
-
2016-06-04T18:43:48.722+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
-
2016-06-04T18:43:48.722+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
-
2016-06-04T18:43:48.722+0800 I CONTROL [initandlisten]
-
> show dbs
-
local 0.000GB
-
>
默認mongo 進入的 是 test ,執行 show dbs ,查看所有數據庫 我這新安裝的就
一個 local db
現在新建一個數據庫 admin 用來保存 新建的userAdminAnyDatabase角色 用戶(這個相當於人事部長啊)
-
> use admin
-
switched to db admin
-
> db
-
admin
有一個要注意的是我在那個數據庫創建的用戶就保存在哪個數據庫,像我現在在 db 輸出 admin,那我的用戶就保存在admin 數據庫。
創建人事部管理員 master
-
> db.createUser({user:"master",pwd:"123456",roles:[{"role":"userAdminAnyDatabase","db":"admin"}]})
-
Successfully added user: {
-
"user" : "master",
-
"roles" : [
-
{
-
"role" : "userAdminAnyDatabase",
-
"db" : "admin"
-
}
-
]
-
}
-
> show dbs
-
admin 0.000GB
-
local 0.000GB
-
>
4配置mongodb
配置前先關閉mongodb
執行 service mongod stop (ubuntu 等系統) 沒有service 的系統如(Mac)執行 killall mongod
進入配置文件
(ubuntu 爲例子) vi /etc/mongod.conf
修改 bindIp : 0.0.0.0
允許所有IP鏈接,外鏈
5 認證模式開啓
-
mongod -f /etc/mongod.conf --fork --auth
-f 是使用的配置文件 (--config)也可以
-fork 是 後臺服務運行
-auth 必須認證才能操作
6登陸到mongodb
-
root@iZ28ec5minyZ:/var/lib# mongo
-
MongoDB shell version: 3.2.6
-
connecting to: test
-
> show dbs
-
2016-06-04T20:29:20.205+0800 E QUERY [thread1] Error: listDatabases failed:{
-
"ok" : 0,
-
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
-
"code" : 13
-
} :
-
_getErrorWithCode@src/mongo/shell/utils.js:25:13
-
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
-
shellHelper.show@src/mongo/shell/utils.js:760:19
-
shellHelper@src/mongo/shell/utils.js:650:15
-
@(shellhelp2):1:1
-
-
>
現在沒有權限了執行任何操作了,當然你能進入 終端
登陸
-
> use admin
-
switched to db admin
-
> db.auth("master","123456")
-
1
-
>
這裏面要注意的是你在那註冊用戶的要去那個db裏認證,就像我是testdb數據庫createUser的,那我先要use testdb
在去db.auth("userName","password")
現在去創建用戶了
-
> db.auth("master","123456")
-
1
-
> db.createUser({user:"jimb55",pwd:"123456",roles:[{"role":"readWrite","db":"jimb55db"}]})
-
Successfully added user: {
-
"user" : "jimb55",
-
"roles" : [
-
{
-
"role" : "readWrite",
-
"db" : "jimb55db"
-
}
-
]
-
}
-
>
jimb55db 是我之前創建的一個db,現在我用master給這個db新建了用戶jimb55 role是 readWrite(讀寫權限)
db 作用的表(這個不是保存用戶和用戶認證的表,當前的表時admin,jimb55被保存到admin,下次登陸也是在admin登陸,當然你可以 use jimb55db 轉換到 jimb55db 後再運行 db.createUser({...}) ,那麼下次就可以再jimb55db登陸也沒問題)
現在創建成功,看看有認證看看
exit 退出終端 再次 mongo 進入終端
-
> use jimb55db
-
switched to db jimb55db
-
> db.auth("jimb55","123456")
-
Error: Authentication failed.
-
0
-
> use admin
-
switched to db admin
-
> db.auth("jimb55","123456")
-
1
看,你在jimb55db 認證失敗了吧
現在看看對 jimb55db 的讀寫操作
-
> use jimb55db
-
switched to db jimb55db
-
> db
-
jimb55db
-
> db.jimb55test.find()
-
{ "_id" : ObjectId("5752cb4cba5ab543f74727a5"), "name" : "jimb55" }
-
> db.jimb55test.insert({name:"jimb55 bTyh"})
-
WriteResult({ "nInserted" : 1 })
-
> db.jimb55test.find()
-
{ "_id" : ObjectId("5752cb4cba5ab543f74727a5"), "name" : "jimb55" }
-
{ "_id" : ObjectId("5752cdea305e84a053d6cc83"), "name" : "jimb55 bTyh" }
-
>
沒有問題了吧。當然我們要做到像mysql那樣遠程鏈接操作並且有個可視化的界面
我現在用的是 robomongo,隨便百度一下下載一個
但填寫資料後發現
認證失敗,要注意的是 robomongo 等認證不過,那是mongodb 版本錯了,這裏要執行命令校正mongodb、版本
先退出 mongod 服務
killall mongod
再在無認證情況下打開 mongod
mongod -f /etc/mongod.conf --fork
進入終端:mongo
-
> use admin
-
switched to db admin
-
> db.dropUser("jimb55")
-
true
-
> db.system.version.update({ "_id" : "authSchema"},{$set: {"currentVersion" : 3} })
-
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
-
> db.createUser({user:"jimb55",pwd:"123456",roles:[{"role":"readWrite","db":"jimb55db"}]})
-
Successfully added user: {
-
"user" : "jimb55",
-
"roles" : [
-
{
-
"role" : "readWrite",
-
"db" : "jimb55db"
-
}
-
]
-
}
-
>
換成版本3了,進入admin 刪除用戶,更改版本version號碼,再重新創建用戶
退出mongo ,killall mongod ,再在認證模式打開mongod
mongod -f /etc/mongod.conf --fork --auth
現在再進入 robomongodb 看看
參考資料:http://liyanjie918.blog.163.com/blog/static/2022729020156261410274/