管理用戶的創建及使用
創建用戶的函數是db.createUser({...})
,創建用戶時通常需要為該用戶添加權限,如read、readWrite權限。
可添加的權限以及說明:
權限 | 作用 |
---|---|
read | 允許用戶讀取指定數據庫。 |
readWrite | 允許用戶讀寫指定數據庫。 |
dbAdmin | 允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile。 |
userAdmin | 允許用戶向system.users集合寫入,可以在指定數據庫里創建、刪除和管理用戶。 |
clusterAdmin | 只在admin數據庫中可用,賦予用戶所有分片和復制集相關函數的管理權限。 |
readAnyDatabase | 只在admin數據庫中可用,賦予用戶所有數據庫的讀權限。 |
readWriteAnyDatabase | 只在admin數據庫中可用,賦予用戶所有數據庫的讀寫權限。 |
userAdminAnyDatabase | 只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限。 |
dbAdminAnyDatabase | 只在admin數據庫中可用,賦予用戶所有數據庫的dbAdmin權限。 |
root | 只在admin數據庫中可用。超級賬號,超級權限。 |
進入到MongoDB命令行,並切換到admin數據庫:
> use admin
switched to db admin
為某用戶添加userAdminAnyDatabase權限:
db.createUser({"user": "[username]", "pwd": "[password]", "roles": [{"role": "userAdminAnyDatabase", "db": "admin"}]})
提示Successfully字樣的信息,即創建用戶成功:
Successfully added user: {
......
}
在重啟MongoDB服務之前,需在配置文件末尾處添加auth = true
,之后必須先進行用戶權限認證才可操作數據庫:
# 權限認證
auth = true
進入到MongoDB命令行(會話)中,切換admin數據庫,並進行權限認證:
> use admin
switched to db admin
> db.auth("[username]", "[password]")
1
1代表用戶權限認證成功,0代表用戶權限認證失敗。
普通用戶的創建及使用
普通用戶除了無法使用clusterAdmin、readAnyDatabase、readWriteAnyDatabase等權限外,其他權限都可使用。
每一個數據庫都有自己的用戶組,用戶組中有多個用戶,每一個用戶的權限可以擁有多個。
[root@VM-0-6-centos mongodb-4.4.6]# ./bin/mongo
......
> db.auth("[username]", "[password]")
Error: Authentication failed.
0
如果沒有切換指定的數據庫,直接進行用戶權限認證,會提示認證失敗的消息。只有admin數據庫的用戶才有權限添加普通用戶。
> use admin
switched to db admin
> db.auth("[username]", "[password]")
1
為training數據庫添加一個普通用戶training:
> use training
switched to db training
> db.createUser( { user: "training", pwd: "training", roles: [ { role: "readWrite", db: "training" } ] } )
Successfully added user: {
......
}
提示:如果當前會話中已經認證了A數據庫的用戶,再切換到B數據庫進行權限認證后,可能會提示“logical sessions can't have multiple authenticated users”錯誤。因為一次會話不能認證多個用戶。
更新用戶權限
db.updateUser("[username]", {...})
函數可以修改用戶的權限以及其他信息。
更新權限之前,需要切換到被更新用戶所在的數據庫,更新操作需要當前會話中認證過的用戶具有userAdmin
或userAdminAnyDatabase
或root
角色的用戶執行。
切換到admin數據庫,修改其中一個用戶的用戶權限:
db.updateUser(
"[username]",
{
"roles": [
{
"role": "userAdminAnyDatabase",
"db": "admin"
},
{
"role": "readWriteAnyDatabase",
"db": "admin"
},
{
"role": "dbAdminAnyDatabase",
"db": "admin"
}
]
}
)
修改成功之后,顯示所有用戶,查看是否更改成功:
> show users
{
"user" : "[username]",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "readWriteAnyDatabase",
"db" : "admin"
},
{
"role" : "dbAdminAnyDatabase",
"db" : "admin"
}
]
}
更改用戶密碼
db.updateUser("[username]", {"pwd": "[password]"})
或db.changeUserPassword("[username]", "[password]")
可以更改用戶的密碼。
更新密碼之前,需要切換到被更新用戶所在的數據庫,更新操作需要當前會話中認證過的用戶具有userAdmin
或userAdminAnyDatabase
或root
角色的用戶執行。
刪除用戶
db.dropUser("[username]")
可以刪除用戶。
刪除用戶之前,需要切換到被刪除用戶所在的數據庫,更新操作需要當前會話中認證過的用戶具有userAdmin
或userAdminAnyDatabase
或root
角色的用戶執行。