3.0版本以前
在mongodb3.0版本以前中,有一個admin數據庫, 牽涉到服務器配置層面的操作,需要先切換到admin數據庫.即 use admin , 相當於進入超級用戶管理模式,mongo的用戶是以數據庫為單位來建立的, 每個數據庫有自己的管理員.我們在設置用戶時,需要先在admin數據庫下建立管理員---這個管理員登陸后,相當於超級管理員.
命令:db.addUser();
簡單參數: db.addUser(用戶名,密碼,是否只讀)
注意: 添加用戶后,我們再次退出並登陸,發現依然可以直接讀數據庫?
原因: mongodb服務器啟動時, 默認不是需要認證的.
要讓用戶生效, 需要啟動服務器時,就指定--auth
選項.這樣, 操作時,就需要認證了.
# 添加用戶
> use admin
> db.addUser('admin','admin',false); # 3.0版本更改為createUser();
# 刪除用戶
> use test
> db.removeUser(用戶名); # 3.0版本更改為dropUser();
3.0版本以后
創建管理員
在3.0版本以后,mongodb默認是沒有admin這個數據庫的,並且創建管理員不再用addUser,而用createUser;
語法說明
{ user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> }, # 任意的數據,一般是用於描述用戶管理員的信息
roles: [
{ role: "<role>", db: "<database>" } | "<role>", # 如果是role就是直接指定了角色,並作用於當前的數據庫
...
] # roles是必傳項,但是可以指定空數組,為空就是不指定任何權限
}
Built-In Roles(內置角色):
- 數據庫用戶角色:read、readWrite;
- 數據庫管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 備份恢復角色:backup、restore;
- 所有數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超級用戶角色:root
這里還有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase) - 內部角色:__system
PS:關於每個角色所擁有的操作權限可以點擊上面的內置角色鏈接查看詳情。
官方Example
use products # mongoDB的權限設置是以庫為單位的,必選要先選擇庫
db.createUser(
{ "user" : "accountAdmin01",
"pwd": "cleartext password",
"customData" : { employeeId: 12345 },
"roles" : [ { role: "clusterAdmin", db: "admin" },
{ role: "readAnyDatabase", db: "admin" },
"readWrite"
] },
{ w: "majority" , wtimeout: 5000 } ) # readWrite 適用於products庫,clusterAdmin與readAnyDatabase角色適用於admin庫
writeConcern文檔(官方說明)
- w選項:允許的值分別是 1、0、大於1的值、"majority"、
; - j選項:確保mongod實例寫數據到磁盤上的journal(日志),這可以確保mongd以外關閉不會丟失數據。設置true啟用。
- wtimeout:指定一個時間限制,以毫秒為單位。wtimeout只適用於w值大於1。
use shop;
db.createUser({
user:'admin',
pwd:'zhouzhou123',
roles:['dbOwner']
})
只要新加了一個用戶,admin數據庫就會重新存在;
mongo --host xxx -u admin -p zhouzhou123 --authenticationDatabase shop # 用新創建的用戶登錄
# 查看當前用戶在shop數據庫的權限
use shop;
db.runCommand(
{
usersInfo:"shopzhouzhou",
showPrivileges:true
}
)
# 查看用戶信息
db.runCommand({usersInfo:"userName"})
# 創建一個不受訪問限制的超級用戶
use admin
db.createUser(
{
user:"superuser",
pwd:"pwd",
roles:["root"]
}
)
認證用戶
> use test
> db.auth(用戶名,密碼); #注意是以庫為單位,必須先選擇庫;
刪除用戶
# 刪除用戶
> use test
> db.dropUser('用戶名');
修改用戶密碼
> use test
> db.changeUserPassword(用戶名, 新密碼);
# 修改密碼和用戶信息
db.runCommand(
{
updateUser:"username",
pwd:"xxx",
customData:{title:"xxx"}
}
)
權限規則
參考: http://blog.csdn.net/kk185800961/article/details/45619863