MongoDB 4.X 用戶和角色許可權管理總結

来源:https://www.cnblogs.com/dbabd/archive/2019/05/05/10811523.html
-Advertisement-
Play Games

關於MongoDB的用戶和角色許可權的梳理一直不太清晰,仔細閱讀了下官方文檔,並對此做個總結。 預設情況下,MongoDB實例啟動運行時是沒有啟用用戶訪問許可權控制的,也就是說,在實例本機伺服器上都可以隨意登錄實例進行各種操作,MongoDB不會對連接客戶端進行用戶驗證,可以想象這是非常危險的。為了強制 ...


關於MongoDB的用戶和角色許可權的梳理一直不太清晰,仔細閱讀了下官方文檔,並對此做個總結。

預設情況下,MongoDB實例啟動運行時是沒有啟用用戶訪問許可權控制的,也就是說,在實例本機伺服器上都可以隨意登錄實例進行各種操作,MongoDB不會對連接客戶端進行用戶驗證,可以想象這是非常危險的。為了強制開啟用戶訪問控制(用戶驗證),則需要在MongoDB實例啟動時使用選項--auth或在指定啟動配置文件中添加選項auth=true

本文就MongoDB用戶的許可權和角色管理進行測試,主要參考的是官方文檔說明。

版本說明

操作系統:CentOS Linux release 7.5.1804 (Core)
資料庫版本:MongoDB v4.0.9

啟用訪問控制

MongoDB使用的是基於角色的訪問控制(Role-Based Access Control,RBAC)來管理用戶對實例的訪問。通過對用戶授予一個或多個角色來控制用戶訪問資料庫資源的許可權和資料庫操作的許可權,在對用戶分配角色之前,用戶無法訪問實例。

在實例啟動時添加選項--auth或指定啟動配置文件中添加選項auth=true

角色

在MongoDB中通過角色對用戶授予相應資料庫資源的操作許可權,每個角色當中的許可權可以顯式指定,也可以通過繼承其他角色的許可權,或者兩都都存在的許可權。

許可權

許可權由指定的資料庫資源(resource)以及允許在指定資源上進行的操作(action)組成。

  1. 資源(resource)包括:資料庫、集合、部分集合和集群;
  2. 操作(action)包括:對資源進行的增、刪、改、查(CRUD)操作。

在角色定義時可以包含一個或多個已存在的角色,新創建的角色會繼承包含的角色所有的許可權。在同一個資料庫中,新創建角色可以繼承其他角色的許可權,在admin資料庫中創建的角色可以繼承在其它任意資料庫中角色的許可權。

關於角色許可權的查看,可以通過如下命令查詢:

// 查詢當前資料庫中的角色許可權
> db.runCommand({ rolesInfo: "<rolename>" })

// 查詢其它資料庫中指定的角色許可權
> db.runCommand({ rolesInfo: { role: "<rolename>", db: "<database>" } }

// 查詢多個角色許可權
> db.runCommand(
    {
        rolesInfo: [
            "<rolename>",
            { role: "<rolename>", db: "<database>" },
            ...
        ]     
    }
)

// 查詢所有角色許可權(僅用戶自定義角色)
> db.runCommand({ rolesInfo: 1 })

// 查詢所有角色許可權(包含內置角色)
> db.runCommand({ rolesInfo: 1, showBuiltinRoles: true })

系統內置角色

MongoDB內部提供了一系列內置的角色,這些角色是為了完成一些基本的資料庫操作。每個內置角色提供了用戶在角色資料庫內資料庫級別所有非系統類集合的訪問許可權,也提供了對集合級別所有系統集合的訪問許可權。MongoDB在每個資料庫上都提供內置的資料庫用戶角色資料庫管理角色,但只在admin資料庫中提供其它的內置角色。

內置角色主要包括以下幾個類別:

  1. 資料庫用戶角色(Database User Roles)
  2. 資料庫管理角色(Database Administration Roles)
  3. 集群管理角色(Cluster Administration Roles)
  4. 備份和恢復角色(Backup and Restoration Roles)
  5. 全資料庫級角色(All-Database Roles)
  6. 超級用戶角色(Superuser Roles)
  7. 內部角色(Internal Role)

資料庫用戶角色

  • read

read角色包含讀取所有非系統集合數據和訂閱部分系統集合(system.indexes、system.js、system.namespaces)的許可權。

該角色許可權包含命令操作:changeStream、collStats、dbHash、dbStats、find、killCursors、listIndexes、listCollections。

  • readWrite

readWrite角色包含read角色的許可權同時增加了對非系統集合數據的修改許可權,但只對系統集合system.js有修改許可權。

該角色許可權包含命令操作:collStats、convertToCapped、createCollection、dbHash、dbStats、dropCollection、createIndex、dropIndex、find、insert、killCursors、listIndexes、listCollections、remove、renameCollectionSameDB、update。

資料庫管理角色

  • dbAdmin

dbAdmin角色包含執行某些管理任務(與schema相關、索引、收集統計信息)的許可權,該角色不包含用戶和角色管理的許可權。

對於系統集合(system.indexes、system.namespaces、system.profile)包含命令操作:collStats、dbHash、dbStats、find、killCursors、listIndexes、listCollections、dropCollection and createCollection(僅適用system.profile)

對於非系統集合包含命令操作:bypassDocumentValidation、collMod、collStats、compact、convertToCapped、createCollection、createIndex、dbStats、dropCollection、dropDatabase、dropIndex、enableProfiler、reIndex、renameCollectionSameDB、repairDatabase、storageDetails、validate

  • dbOwner

dbOwner角色包含對數據所有的管理操作許可權。即包含角色readWrite、dbAdmin和userAdmin的許可權。

  • userAdmin

userAdmin角色包含對當前資料庫創建和修改角色和用戶的許可權。該角色允許向其它任何用戶(包括自身)授予任何許可權,所以這個角色也提供間接對超級用戶(root)的訪問許可權,如果限定在admin數據中,也包括集群管理的許可權。

該角色許可權包含命令操作:changeCustomData、changePassword、createRole、createUser、dropRole、dropUser、grantRole、revokeRole、setAuthenticationRestriction、viewRole、viewUser。

集群管理角色

  • clusterManager

clusterManager角色包含對集群監控和管理操作的許可權。擁有此角色的用戶能夠訪問集群中的config資料庫和local資料庫。

對於整個集群該角色包含命令操作:addShard、appendOplogNote、applicationMessage、cleanupOrphaned、flushRouterConfig、listSessions (3.6新增)、listShards、removeShard、replSetConfigure、replSetGetConfig、replSetGetStatus、replSetStateChange、resync。

對於集群中所有的資料庫包含命令操作:enableSharding、moveChunk、splitChunk、splitVector。

對於集群中config資料庫和local資料庫包含的命令操作可以參考官方文檔:https://docs.mongodb.com/manual/reference/built-in-roles/#clusterManager

  • clusterMonitor

clusterMonitor角色包含針對監控工具具有隻讀操作的許可權。如工具MongoDB Cloud Manager和工具Ops Manager

對於整個集群該角色包含命令操作:checkFreeMonitoringStatus(4.0新增)、connPoolStats、getCmdLineOpts、getLog、getParameter、getShardMap、hostInfo、inprog、listDatabases、listSessions (3.6新增)、listShards、netstat、replSetGetConfig、replSetGetStatus、serverStatus、setFreeMonitoring (4.0新增)、shardingState、top。

對於集群中所有的數據為包含命令操作:collStats、dbStats、getShardVersion、indexStats、useUUID(3.6新增)。

對於集群中config資料庫和local資料庫包含的命令操作可以參考官方文檔:https://docs.mongodb.com/manual/reference/built-in-roles/#clusterMonitor

  • hostManager

hostManager角色包含針對資料庫伺服器的監控和管理操作許可權。

對於整個集群該角色包含命令操作:applicationMessage、closeAllDatabases、connPoolSync、cpuProfiler、flushRouterConfig、fsync、invalidateUserCache、killAnyCursor (4.0新增)、killAnySession (3.6新增)、killop、logRotate、resync、setParameter、shutdown、touch、unlock。

對於集群中所有的資料庫包含命令操作:killCursors、repairDatabase。

  • clusterAdmin

clusterAdmin角色包含MongoDB集群管理最高的操作許可權。該角色包含clusterManagerclusterMonitorhostManager三個角色的所有許可權,並且還擁有dropDatabase操作命令的許可權。

備份和恢復角色

  • backup

backup角色包含備份MongoDB數據最小的許可權。

對於MongoDB中所有的資料庫資源包含命令操作:listDatabases、listCollections、listIndexes。

對於整個集群包含命令操作:appendOplogNote、getParameter、listDatabases。

對於以下資料庫資源提供find操作許可權:

  1. 對於集群中的所有非系統集合,包括自身的config資料庫和local資料庫;
  2. 對於集群中的系統集合:system.indexes、system.namespaces、system.js和system.profile;
  3. admin資料庫中的集合:admin.system.users和admin.system.roles;
  4. config.settings集合;
  5. 2.6版本之前的system.users集合。

對於config.setting集合還有insert和update操作許可權。

  • restore

restore角色包含從備份文件中還原恢復MongoDB數據(除了system.profile集合)的許可權。

restore角色有以下註意事項:

  1. 如果備份中包含system.profile集合而恢複目標資料庫沒有system.profile集合,mongorestore會嘗試重建該集合。因此執行用戶需要有額外針對system.profile集合的createCollection和convertToCapped操作許可權;
  2. 如果執行mongorestore命令時指定選項--oplogReplay,則restore角色包含的許可權無法進行重放oplog。如果需要進行重放oplog,則需要只對執行mongorestore的用戶授予包含對實例中任何資源具有任何許可權的自定義角色。

對於整個集群包含命令操作:getParameter。

對於所有非系統集合包含命令操作:bypassDocumentValidation、changeCustomData、changePassword、collMod、convertToCapped、createCollection、createIndex、createRole、createUser、dropCollection、dropRole、dropUser、grantRole、insert、revokeRole、viewRole、viewUser。

關於restore角色包含其它的命令操作可以參考官方文檔:https://docs.mongodb.com/manual/reference/built-in-roles/#restore

全資料庫級角色

以下角色只存在於admin資料庫,並且適用於除了config和local之外所有的資料庫。

  • readAnyDatabase

readAnyDatabase角色包含對除了config和local之外所有資料庫的只讀許可權。同時對於整個集群包含listDatabases命令操作。

在MongoDB3.4版本之前,該角色包含對config和local資料庫的讀取許可權。當前版本如果需要對這兩個資料庫進行讀取,則需要在admin資料庫授予用戶對這兩個資料庫的read角色。

  • readWriteAnyDatabase

readWriteAnyDatabase角色包含對除了config和local之外所有資料庫的讀寫許可權。同時對於整個集群包含listDatabases命令操作。

在MongoDB3.4版本之前,該角色包含對config和local資料庫的讀寫許可權。當前版本如果需要對這兩個資料庫進行讀寫,則需要在admin資料庫授予用戶對這兩個資料庫的readWrite角色。

  • userAdminAnyDatabase

userAdminAnyDatabase角色包含類似於userAdmin角色對於所有資料庫的用戶管理許可權,除了config資料庫和local資料庫。

對於集群包含命令操作:authSchemaUpgrade、invalidateUserCache、listDatabases。

對於系統集合admin.system.users和admin.system.roles包含命令操作:collStats、dbHash、dbStats、find、killCursors、planCacheRead、createIndex、dropIndex。

該角色不會限制用戶授予許可權的操作,因此,擁有角色的用戶也有可能授予超過角色範圍內的許可權給自己或其它用戶,也可以使自己成為超級用戶,userAdminAnyDatabase角色也可以認為是MongoDB中的超級用戶角色。

  • dbAdminAnyDatabase

dbAdminAnyDatabase角色包含類似於dbAdmin角色對於所有資料庫管理許可權,除了config資料庫和local資料庫。同時對於整個集群包含listDatabases命令操作。

在MongoDB3.4版本之前,該角色包含對config和local資料庫的管理許可權。當前版本如果需要對這兩個資料庫進行管理,則需要在admin資料庫授予用戶對這兩個資料庫的dbAdmin角色。

超級用戶角色

以下角色包含在任何資料庫授予任何用戶任何許可權的許可權。這意味著用戶如果有以下角色之一可以為自己在任何資料庫授予任何許可權。

  • dbOwner角色(作用範圍為admin資料庫)
  • userAdmin角色(作用範圍為admin資料庫)
  • userAdminAnyDatabase角色

以下角色包含資料庫所有資源的所有操作許可權。

  • root

root角色包含角色readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase、clusterAdmin、restore和backup聯合之後所有的許可權。

內部角色

  • **__system**

MongoDB將此角色授予代表集群成員的用戶對象,如副本集(replica set)成員或mongos實例。該角色允許用戶對於需要的資料庫操作都具有相應的許可權,不要將該角色授予應用程式用戶或其它管理員用戶。

總結

通過以上對內置角色的說明,總結一下較為常用的內置角色,如下表:

角色 許可權描述
read 可以讀取指定資料庫中任何數據。
readWrite 可以讀寫指定資料庫中任何數據,包括創建、重命名、刪除集合。
readAnyDatabase 可以讀取所有資料庫中任何數據(除了資料庫config和local之外)。
readWriteAnyDatabase 可以讀寫所有資料庫中任何數據(除了資料庫config和local之外)。
dbAdmin 可以讀取指定資料庫以及對資料庫進行清理、修改、壓縮、獲取統計信息、執行檢查等操作。
dbAdminAnyDatabase 可以讀取任何資料庫以及對資料庫進行清理、修改、壓縮、獲取統計信息、執行檢查等操作(除了資料庫config和local之外)。
clusterAdmin 可以對整個集群或資料庫系統進行管理操作。
userAdmin 可以在指定資料庫創建和修改用戶。
userAdminAnyDatabase 可以在指定資料庫創建和修改用戶(除了資料庫config和local之外)。

用戶自定義角色

雖然MongoDB提供了一系列內置角色,但有時內置角色所包含的許可權並不滿足所有需求,所以MongoDB也提供了創建自定義角色的方法。當創建一個自定義角色時需要進入指定資料庫進行操作,因為MongoDB通過資料庫和角色名稱對角色進行唯一標識。

除了在admin資料庫中創建的角色之外,在其它資料庫中創建的自定義角色包含的許可權只適用於角色所在的資料庫,並且只能繼承同資料庫其它角色的許可權。在admin資料庫中創建的自定義角色則不受此限制。

MongoDB將所有的角色信息存儲在admin資料庫的system.roles集合中,不建議直接訪問此集合內容,而是通過角色管理命令來查看和編輯自定義角色。

創建自定義角色

測試環境說明:

> show dbs;
admin   0.000GB
config  0.000GB
dbabd   0.001GB
local   0.000GB

> use dbabd;
switched to db dbabd

> show collections;
city
user_operation

> db.city.count()
600

> db.user_operation.count()
22068

在admin資料庫中創建自定義用戶dbabd,對集合city有find,update許可權,對集合user_operation只有find許可權。

> db.createRole(
    {
        role: "dbabd",
        privileges: [
            { resource: { db: "dbabd", collection: "city" }, actions: ["find", "update"] },
            { resource: { db: "dbabd", collection: "user_operation" }, actions: ["find"] },
        ],
        roles: []
    }
)

或

> db.adminCommand(
    {
        createRole: "dbabd",
        privileges: [
            { resource: { db: "dbabd", collection: "city" }, actions: ["find", "update"] },
            { resource: { db: "dbabd", collection: "user_operation" }, actions: ["find"] }
        ],
        roles: []
    }
)

查看自定義角色

> db.getRole("dbabd", { showPrivileges: true })

或

> db.getRoles({ rolesInfo: 1, showPrivileges: true })

或

> use admin
> db.runCommand(
    {
        rolesInfo: { role: "dbabd", db: "admin" },
        showPrivileges: true
    }
)

更新自定義角色

為自定義角色dbabd更新集合dbabd.user_operation的insert許可權。

> db.updateRole(
    "dbabd",
    {
        privileges: [
            { resource: { db: "dbabd", collection: "city" }, actions: ["find", "update"] },
            { resource: { db: "dbabd", collection: "user_operation" }, actions: ["find", "insert"] }
        ],
        roles: []
    }
)

或

> db.adminCommand(
    {
        updateRole: "dbabd",
        privileges: [
            { resource: { db: "dbabd", collection: "city" }, actions: ["find", "update"] },
            { resource: { db: "dbabd", collection: "user_operation" }, actions: ["find", "insert"] }
        ],
        roles: []
    }
)

添加角色許可權

為自定義角色dbabd添加集合dbabd.user_operation的remove許可權。

db.grantPrivilegesToRole(
    "dbabd",
    [
        { resource: { db: "dbabd", collection: "user_operation" }, actions: ["remove"] }
    ]
)

或

> use admin
> db.runCommand(
    {
        grantPrivilegesToRole: "dbabd",
        privileges: [
            { resource: { db: "dbabd", collection: "user_operation" }, actions: ["remove"] }
        ]
    }
)

刪除角色許可權

為自定義角色dbabd收回集合dbabd.city的update許可權。

> db.revokePrivilegesFromRole(
    "dbabd", 
    [
        { resource: { db: "dbabd", collection: "city" }, actions: ["update"] }
    ]
)

或

> use admin
> db.runCommand(
    { 
        revokePrivilegesFromRole: "dbabd", 
        privileges: [
            { resource: { db: "dbabd", collection: "city" }, actions: ["update"] }
        ] 
    }
)

添加角色繼承的角色

為自定義角色dbabd添加dbabd資料庫的read角色,繼承其角色許可權。

> use dbabd
> db.grantRolesToRole("dbabd", [{ role: "read", db: "dbabd" }])

或

> use dbabd
> db.runCommand({ grantRolesToRole: "dbabd", roles: [{ role: "read", db: "dbabd" }] })

// 查詢角色信息驗證
> db.getRole("dbabd")

{
    "role" : "dbabd",
    "db" : "admin",
    "isBuiltin" : false,
    "roles" : [
        {
            "role" : "read",
            "db" : "dbabd"
        }
    ],
    "inheritedRoles" : [
        {
            "role" : "read",
            "db" : "dbabd"
        }
    ]
}

刪除角色繼承的角色

為自定義角色dbabd收回dbabd資料庫的read角色及其角色許可權。

> use dbabd
> db.revokeRolesFromRole("dbabd", [{ role: "read", db: "dbabd" }])

或

> use dbabd
> db.runCommand({ revokeRolesFromRole: "dbabd", roles: [{ role: "read", db: "dbabd" }] })

//查詢角色信息驗證
> db.getRole("dbabd")

{
    "role" : "dbabd",
    "db" : "admin",
    "isBuiltin" : false,
    "roles" : [ ],
    "inheritedRoles" : [ ]
}

刪除自定義角色

刪除自定義角色dbabd。

> use admin
> db.dropRole("dbabd")

或

> use admin
> db.runCommand({ dropRole: "dbabd" })

用戶

MongoDB是基於角色的訪問控制,所以創建用戶需要指定用戶的角色,在創建用戶之前需要滿足:

  1. 先在admin資料庫中創建角色為userAdmin或userAdminAnyDatabase的用戶作為管理用戶的用戶;
  2. 啟用訪問控制,進行登錄用戶驗證,這樣創建用戶才有意義。

創建用戶管理的用戶

啟用訪問控制登錄之前,首先需要在admin資料庫中創建角色為userAdmin或userAdminAnyDatabase作為用戶管理的用戶,之後才能通過這個用戶創建其它角色的用戶,這個用戶作為其它所有用戶的管理者。

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

Successfully added user: {
    "user" : "user_admin",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

開啟訪問控制

要開啟訪問控制,則需要在mongod進程啟動時加上選項--auth或在啟動配置文件加入選項auth=true,並重啟mongodb實例。

## mongod配置文件如下
# cat mongodb.cnf 
journal=true
dbpath=/data/mongodb/4.0/data
directoryperdb=true
fork=true
port=27017
logpath=/data/mongodb/4.0/logs/mongodb.log
quiet=true
bind_ip_all=true
auth=true

## 啟動mongodb實例
# mongod -f mongodb.cnf 
about to fork child process, waiting until server is ready for connections.
forked process: 44347
child process started successfully, parent exiting

使用mongo shell登錄mongodb實例:

# mongo 192.168.58.2:27017
MongoDB shell version v4.0.9
connecting to: mongodb://192.168.58.2:27017/test?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("428c215c-2927-49ee-8507-573efc4a1185") }
MongoDB server version: 4.0.9
>

// 如果沒有開啟訪問控制,則在登錄時會提示如下警告信息
** WARNING: Access control is not enabled for the database.
**          Read and write access to data and configuration is unrestricted.

用戶管理用戶驗證

可以在使用mongo shell登錄時添加選項--authenticationDatabase或登錄完後在admin資料庫下進行驗證。

在mongo shell登錄時同時進行驗證:

# mongo 192.168.58.2:27017 -uuser_admin -p --authenticationDatabase admin
MongoDB shell version v4.0.9
Enter password:  # 輸入密碼admin

connecting to: mongodb://192.168.58.2:27017/test?authSource=admin&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("94663b8d-7d88-4c97-ad1c-c3c24262ad39") }
MongoDB server version: 4.0.9
> 

mongo shell登錄完成之後進行驗證:

# mongo 192.168.58.2:27017
MongoDB shell version v4.0.9
connecting to: mongodb://192.168.58.2:27017/test?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("531e75df-3a5d-4f35-9e18-d7a6e090df63") }
MongoDB server version: 4.0.9

> use admin
switched to db admin

> db.auth('user_admin','admin')
1

用戶管理操作

創建普通用戶

使用user_admin用戶在admin資料庫中創建基於角色dbabd的用戶dbabd_user,密碼為dbabd。

> use admin
> db.createUser(
    {
        user: "dbabd_user",
        pwd: "dbabd",
        roles: ["dbabd"],
        customData: { info: "user for dbabd" }
    }
)
Successfully added user: {
    "user" : "dbabd_user",
    "roles" : [
        "dbabd"
    ],
    "customData" : {
        "info" : "user for dbabd"
    }


或

> db.getSiblingDB("admin").runCommand(
    {
        createUser: "dbabd_user",
        pwd: "dbabd",
        customData: { info: "user for dbabd" },
        roles: ["dbabd"]
    }
)
{ "ok" : 1 }

查看用戶信息

> use admin
> db.getUser("dbabd_user", { showPrivileges: true })

或

> db.getSiblingDB("admin").runCommand(
    {
        usersInfo: "dbabd_user",
        showPrivileges: true

    }
)

為用戶添加角色

用戶dbabd_user添加admin資料庫的readWrite角色。

> use admin
> db.grantRolesToUser(
    "dbabd_user",
    [
        { role: "readWrite", db: "admin" },
        { role: "dbabd", db: "admin" }
    ]
)

或

> use admin
> db.runCommand(
    {
        grantRolesToUser: "dbabd_user",
        roles:
            [
                { role: "readWrite", db: "admin" },
                { role: "dbabd", db: "admin" }
            ]
    }
)

更新用戶信息

更新用戶dbabd_user具有admin資料庫readWrite角色為read角色。

> use admin
> db.updateUser(
    "dbabd_user",
    {
        customData: { info: "user for dbabd" },
        roles: [
            { role: "dbabd", db: "admin" },
            { role: "read", db: "admin" }
        ]
    }
)

或

> use admin
> db.runCommand(
    {
        updateUser: "dbabd_user",
        customData: { info: "user for dbabd" },
        roles: [
            { role: "dbabd", db: "admin" },
            { role: "read", db: "admin" }
        ]
    }
)

為用戶回收角色

用戶dbabd_user回收admin資料庫的read角色。

> use admin
> db.revokeRolesFromUser(
    "dbabd_user",
    [
        { role: "read", db: "admin" }
    ]
)

或

> use admin
> db.runCommand(
    {
        revokeRolesFromUser: "dbabd_user",
        roles:
            [
                { role: "read", db: "admin" }
            ]
    }
)

更改用戶密碼

更改用戶dbabd_user密碼為dbabdnew。

> use admin
> db.changeUserPassword("dbabd_user", "dbabdnew")

刪除用戶

刪除用戶dbabd_user。

> use admin
> db.dropUser("dbabd_user")

或

> use admin
> db.runCommand({ dropUser: "dbabd_user" })

關於更多用戶管理操作信息可以參考官方文檔說明:https://docs.mongodb.com/manual/reference/method/js-user-management/

總結

一直以為MongoDB對於安全性能不是特別重視,在重新閱讀了最新版本的官方文檔之後有了很大的改觀,對於基於角色的用戶訪問控制能夠更為精細地控制訪問用戶的許可權。在新的版本當中對於密碼加密機制以及加密演算法都做了很大的改進與提升,通過這次總結梳理可以給本文總結如下:

  1. MongoDB中角色和用戶是建立在資料庫中的;
  2. 在哪個資料庫中創建用戶就需要在哪個資料庫中進行驗證;
  3. 為了更好對用戶許可權進行控制,最好為每個用戶創建一個自定義角色。

參考

https://docs.mongodb.com/manual/tutorial/enable-authentication/
https://docs.mongodb.com/manual/reference/command/nav-role-management/
https://docs.mongodb.com/manual/reference/command/nav-user-management/

☆〖本人水平有限,文中如有錯誤還請留言批評指正!〗☆


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 遇到一個錯誤如下 System.Data.SqlClient.SqlException HResult=0x80131904 Message=伺服器主體 "用戶名" 無法在當前安全上下文下訪問資料庫 "資料庫名"。 Source=.Net SqlClient Data Provider StackT ...
  • 1.線性回歸模型線性回歸是統計學中最常用的演算法,當你想表示兩個變數間的數學關係時,就可以用線性回歸。當你使用它時,你首先假設輸出變數(相應變數、因變數、標簽)和預測變數(自變數、解釋變數、特征)之間存在的線性關係。(自變數是指:研究者主動操縱,而引起因變數發生變化的因素或條件,因此自變數被看作是因變 ...
  • 1.關係型資料庫的特點 基於關係代數理論: 缺點:表結構不直觀,實現複雜,速度慢 優點:健壯性高、社區龐大,在一些情況下人們發現健壯性,並不是要求那麼高,因而產生了十分流行的非關係型資料庫,如Redis,Memcached等。 2.資料庫表關係 下麵以Product表和Category進行舉例,Ca ...
  • 腳本如下: EXEC sp_addlinkedserver @server='XXX', --鏈接伺服器別名 @srvproduct='', @provider='SQLOLEDB', @datasrc='.' --要訪問的的資料庫所在的伺服器的ip GO EXEC sp_addlinkedsrvl ...
  • A/B測試本質上是一種線上實驗。本篇把業務中常見的概念與A/B測試專業術語進行對應,並額外介紹其他實用且重要的概念。 ...
  • Coprocessor簡介 (1)實現目的 (2)靈感來源 靈感來源於Bigtable的協處理器,包含如下特性: (3)提供介面 (4)應用範圍 Endpoint服務端實現 在傳統關係型資料庫裡面,可以隨時的對某列進行求和sum,但是目前HBase目前所提供的介面,直接求和是比較困難的,所以先編寫好 ...
  • [20190505]關於latch 一些統計信息.txt--//我在兩篇文章,提到一些latch的統計信息.鏈接如下:http://blog.itpub.net/267265/viewspace-2642329/ =>[20190423]簡單測試latch nowilling等待模式.txthttp ...
  • String 結構 結構:Key Value對 Value:可以是字元串、數字,也可以是二進位數組 限制:Value最大值為512MB String 常用命令 1.get key • 含義:獲取指定key的值 2.set key value • 含義:設置指定key的值 3.incr key • 含 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...