mongodb權限管理01

mongodb權限管理基礎概念
概念解釋
1.數據庫用戶角色
read:該角色擁有數據的只讀權限,系統集合以及system.indexes,system.js,system.namespaces集合除外。
readWrite:該角色擁有對應數據庫的讀寫權限,系統集合和system.js集合除外。
2.數據庫管理角色
dbAdmin:該角色擁有指定數據庫數據庫管理權限,包括 system.indexes, system.namespaces, system.profile集合的操作權限。該角色不擁有所有非系統集合的讀權限。
dbOwner:該角色擁有指定數據庫的所有權限,該角色包括:readWrite、dbAdmin、userAdmin。
userAdmin:該角色擁有指定數據庫用戶和角色的管理權限。包括創建用戶等。
3.羣集管理角色
clusterAdmin:該角色擁有羣集的所有權限。該角色包含clusterManager,clusterMonitor,hostManager 角色權限。同時還要刪除數據庫的權限。
clusterManager:該角色擁有羣集的管理和監控權限,包括對local、config數據庫的訪問權限。同時該角色擁有分片和複製集的管理權限。
clusterMonitor:該角色擁有羣集的監控權限。
hostManager:該角色擁有羣集的監控和服務管理權限。
//注意:這些角色只能在Admin數據庫下創建
4.備份還原角色
backup:該角色擁有備份數據的權限。
restore:該角色擁有還原備份數據的權限。
//注意:這些角色只能在Admin數據庫下創建
5.所有數據庫角色
該分類下面的角色權限和數據庫角色權限一樣,區別在於它擁有的是所有數據庫的權限而不是指定數據庫下的權限。但是不擁有system.*相關集合、local、config數據庫的權限。
readAnyDatabase
readWriteAnyDatabase
userAdminAnyDatabase
dbAdminAnyDatabase
//注意:這些角色只能在Admin數據庫下創建
6.超級權限角色
root:該角色擁有所有權限,該角色包含readWriteAnyDatabase, dbAdminAnyDatabase, userAdminAnyDatabase, clusterAdmin roles, restore, and backup角色。
注意:該角色只能在創建在Admin庫中
7.內部角色
__system:該角色爲系統內部角色,比如複製集成員、mongos使用。

參考鏈接:我們需要整理小結一下,整個流程
MongoDB 4.X 用戶和角色權限管理總結
https://www.cnblogs.com/dbabd/p/10811523.html
//完全參照此鏈接 可行

小結如下:
1、謹記:先在不開啓認證的情況下,創建用戶,之後關閉服務,然後再開啓認證,才生效。
2、我們正常的搭建mongodb,然後在創建自定義角色
(在admin數據庫中創建自定義用戶dbabd,對集合city有find,update權限,對集合user_operation只有find權限。)
//我的猜想,我們可以不創建這個 後面進行驗證
3、用戶,必須先創建“創建用戶管理的用戶”
//啓用訪問控制登錄之前,首先需要在admin數據庫中創建角色爲userAdmin或userAdminAnyDatabase作爲用戶管理的用戶,之後才能通過這個用戶創建其它角色的用戶,這個用戶作爲其它所有用戶的管理者。
4、開啓訪問控制,在這裏我們在啓動 mongodb的時候加上--auth (注意,我們在配置文件中加auth=true的時候沒有成功)
//[root@prd3-mysql-0-36 ~]# mongod -f /ivargo/app/mongodb/conf/mongo.conf --auth
5、用戶管理用戶驗證 可以使用我們創建的管理用戶的用戶去登錄 ,在這裏就是user_admin 這個用戶去登錄
//可以理解爲 是目前mongodb的最高權限者
6、接下來,纔是創建一個普通用戶,給他某個庫的可讀,可寫的權限
//也就是說,必須要自己先創建一個管理普通用戶的用戶,然後在登錄到這個管理用戶的用戶下 去創建文明想要創建的用戶。
7、創建好了普通用戶,之後,就是爲用戶添加角色(我的理解,角色就是權限的意思)
比如 爲用戶dbabd_user添加dbabd數據庫的read角色(權限)。

接下來,我們可以根據我寫的小結,再次的實驗一次

上面的測試中創建管理用戶用戶名 的角色爲 userAdminAnyDatabase 他的權限分配爲:可以在指定數據庫創建和修改用戶(除了數據庫config和local之外)。
如果是root的角色的話,那麼就是超級最大的權限 ,我們下面試一下,最高的root權限

// 創建管理用戶用戶名爲user_admin,密碼admin
db.createUser(
{
user: "user_admin",
pwd: "admin",
roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
}
)

//總結

use admin
switched to db admin
db.system.users.find()
{ "_id" : "admin.user_admin", "user" : "user_admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "YVnHB6u4l4kxyVkAG9h6bQ==", "storedKey" : "u0bVa7oIMBQpyD8vzv9HQHAHBGk=", "serverKey" : "XE9j9YQKKWi8/1CdXchLWILs6Ds=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "q1riE6iDxYrY3ROeVAw59q8DXg47B5DeGxtw6w==", "storedKey" : "OVbdZPfC7CsmHGZKKiW2jH50cqMgPX8OfTgfcTg3MXM=", "serverKey" : "0TjC2lObSJ7lmzwTMNXWWeG6leHLpzK9n+VReDUrKEs=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
{ "_id" : "admin.dbabd_user", "user" : "dbabd_user", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "Uvls4hIsjxHctMK8etQRQA==", "storedKey" : "/KAF4Zl7nOmeMEy+UBnpLVNPhvw=", "serverKey" : "/g85OaGcrfWAfisbllqAdqjUTP8=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "vCoqeEVfao5T6Rv6dMlw7J6zDFU0KoqDjRxXyA==", "storedKey" : "IL1NENjImUYXiRuxxSA3uz4ein8OPNx/VJZVag0BcV0=", "serverKey" : "GCRyzJ8siZEgAL6qURfuY4GQn7VYz4+o2PmtmT4rqmc=" } }, "customData" : { "info" : "user for dbabd" }, "roles" : [ { "role" : "read", "db" : "dbabd" }, { "role" : "dbabd", "db" : "admin" }, { "role" : "read", "db" : "admin" } ] }

show users;
{
"_id" : "admin.dbabd_user",
"user" : "dbabd_user", //這是創建的普通的用戶
"db" : "admin",
"customData" : {
"info" : "user for dbabd"
},
"roles" : [
{
"role" : "read", //角色爲只讀
"db" : "dbabd" //針對dbadb這個數據庫
},
{
"role" : "dbabd", //這個角色是我們自己創建自定義的角色 dbabd
"db" : "admin"
},
{
"role" : "read",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
{
"_id" : "admin.user_admin", //管理普通用戶的用戶
"user" : "user_admin",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}

自定義實驗 ***** 很重要,看完 https://www.cnblogs.com/dbabd/p/10811523.html 給自己出的題目 很重要
題目爲:
在mongodb中需要先創建一個 管理用戶的用戶 vargo 密碼爲 vargo123 分配給他的權限爲root
在創建一個majihui的普通用戶 密碼爲 majihui123 只對 dbabd這個庫有隻讀的權限

爲了保持實驗的可靠性,請重新安裝mongodb 完全乾淨的進行實驗

接下來,我們創建一個用戶叫 
//在mongodb中需要先創建一個 管理用戶的用戶 vargo 密碼爲 vargo123  分配給他的權限爲root
在創建一個majihui的普通用戶 密碼爲 majihui123 只對 dbabd這個庫有隻讀的權限
// 創建管理用戶用戶名爲vargo,密碼vargo123
use admin
db.createUser(
    {
        user: "vargo",
        pwd: "vargo123",
        roles: [{ role: "root", db: "admin" }]
    }
)
實際操作爲:
> use admin
switched to db admin
> db.createUser(
...     {
...         user: "vargo",
...         pwd: "vargo123",
...         roles: [{ role: "root", db: "admin" }]
...     }
... )
Successfully added user: {
        "user" : "vargo",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ]
}

接下來,我們關閉 mongodb 然後重啓mongodb 之後,然後進行 用戶管理用戶驗證 的開啓mongodb方式
[root@prd3-mysql-0-36 ~]# mongod -f /ivargo/app/mongodb/conf/mongo.conf --auth

vargo就是最高權限了

//接下來創建一個majihui的普通用戶 密碼爲 majihui123 只對 dbabd這個庫有隻讀的權限
use admin
db.createUser(
    {
        user: "majihui",
        pwd: "majihui123",
        roles:[{role:"read",db:"dbabd"}],
        customData: { info: "user for dbabd" }
    }
)
實際操作
> use admin
switched to db admin
> db.createUser(
...     {
...         user: "majihui",
...         pwd: "majihui123",
...         roles:[{role:"read",db:"dbabd"}],
...         customData: { info: "user for dbabd" }
...     }
... )
Successfully added user: {
        "user" : "majihui",
        "roles" : [
                {
                        "role" : "read",
                        "db" : "dbabd"
                }
        ],
        "customData" : {
                "info" : "user for dbabd"
        }
}

我們來驗證一下
[root@prd3-mysql-0-36 ~]# mongo
MongoDB shell version v4.0.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.2

use admin
switched to db admin
db.auWarning: unable to run listCollections, attempting to approximate collection names by parsing connectionStatus
db.auth('majihui','majihui123')
1
show dbs;
dbabd 0.000GB
use dbabd;
switched to db dbabd
show collections;
city
user_operation
db.city.find();
{ "_id" : ObjectId("5ce27f0484dc5c8b35081590"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5ce27f1184dc5c8b35081591"), "title" : "redis 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5ce27f1784dc5c8b35081592"), "title" : "mysql 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
db.user_operation.count();
1
//我們接下來 去嘗試的插入一個數據試一下
db.user_operation.insert({title: 'majihui 教程',
description: 'MongoDB 是一個 Nosql 數據庫',
by: '菜鳥教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 300
})
實際操作
db.user_operation.insert({title: 'majihui 教程',
... description: 'MongoDB 是一個 Nosql 數據庫',
... by: '菜鳥教程',
... url: 'http://www.runoob.com',
... tags: ['mongodb', 'database', 'NoSQL'],
... likes: 300
... })
WriteCommandError({
"ok" : 0,
"errmsg" : "not authorized on dbabd to execute command { insert: \"user_operation\", ordered: true, lsid: { id: UUID(\"441b14ee-ab6e-44c3-9b23-7640ceeb6b1f\") }, $db: \"dbabd\" }",
"code" : 13,
"codeName" : "Unauthorized"
})
出現報錯,正確
//我們接下來嘗試的去刪除一個文檔
db.user_operation.find();
{ "_id" : ObjectId("5ce27f4684dc5c8b35081593"), "title" : "mysql 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
db.user_operation.deleteMany( title : "mysql 教程");
2019-05-21T14:04:45.765+0800 E QUERY [js] SyntaxError: missing ) after argument list @(shell):1:36
//報錯,無法刪除,對了
db.user_operation.find();
{ "_id" : ObjectId("5ce27f4684dc5c8b35081593"), "title" : "mysql 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章