对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs 菜单

管理自管理部署中的用户和角色

以下示例介绍了在 MongoDB 授权模型下进行自管理部署的用户和角色管理。要创建用户,请参阅在自管理部署上创建用户。

如果已为部署启用访问权限控制,则必须以具有每节中指定的所需权限的用户身份进行身份验证。 要执行本教程中列出的操作,用户管理员需要具有特定数据库中的userAdminAnyDatabase角色或userAdmin角色。 有关添加用户管理员作为第一个用户的详细信息,请参阅对自托管部署启用访问控制

注意

要在MongoDB Atlas中创建用户定义的角色,请参阅MongoDB Atlas文档中的添加自定义角色。

MongoDB 为常见访问模式提供内置角色。如果内置角色不覆盖所需权限,请创建用户定义角色。

除在 admin 数据库中创建的角色之外,角色只能包含会应用于其数据库的特权,且只能从其数据库中的其他角色来继承。

在 admin 数据库中创建的角色可包含会应用于 admin 数据库、其他数据库或集群资源的特权,且可从其他数据库和 admin 数据库中的角色来继承。

要创建新角色,请使用 db.createRole() 方法,在 privileges 数组中指定权限,在 roles 数组中指定继承的角色。

MongoDB 使用数据库名称和角色名称的组合来唯一定义角色。每个角色的范围都限于您创建该角色的数据库,但 MongoDB 将所有角色信息存储在 admin 数据库的 admin.system.roles 集合中。

要在数据库中创建角色,必须:

通过内置角色 userAdmin 和 userAdminAnyDatabase,可在各自的资源上执行 createRole 和 grantRole 操作。

要在指定 authenticationRestrictions 时创建角色,必须针对创建该角色的数据库资源执行 setAuthenticationRestriction 操作。

要使用 mongosh 添加自定义用户定义角色,请参阅以下示例:

以下示例创建了一个名为 manageOpRole 的角色,该角色仅提供运行 db.currentOp() 和 db.killOp() 的权限。[1]

注意

用户不需要任何特定权限即可查看或终止自己在 mongod 实例上的操作。有关详细信息,请参阅 db.currentOp() 和 db.killOp()。

1

使用先决条件部分中指定的权限连接到 mongod 或 mongos。

以下过程使用对自管理部署启用访问控制中创建的 myUserAdmin。

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

myUserAdmin 拥有在 admin 和其他数据库中创建角色的权限。

2

manageOpRole 具有对多个数据库和集群资源执行操作的权限。因此,您必须在 admin 数据库中创建角色。

use admin
db.createRole(
{
role: "manageOpRole",
privileges: [
{ resource: { cluster: true }, actions: [ "killop", "inprog" ] },
{ resource: { db: "", collection: "" }, actions: [ "killCursors" ] }
],
roles: []
}
)

新角色会授予终止任何操作的权限。

警告

终止正在运行的操作时要格外小心。仅使用 db.killOp() 方法或 killOp 命令来终止客户端发起的操作,而不会终止数据库内部操作。

[1] 内置角色 clusterMonitor 还提供运行 db.currentOp() 的权限以及其他权限,内置角色 hostManager 提供运行 db.killOp() 的权限以及其他权限。

下面的示例创建了一个名为 mongostatRole 的角色,该角色只提供运行 mongostat 的权限。[2]

1

使用先决条件部分中指定的权限连接到 mongod 或 mongos。

以下过程使用对自管理部署启用访问控制中创建的 myUserAdmin。

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

myUserAdmin 拥有在 admin 和其他数据库中创建角色的权限。

2

mongostatRole 具有对集群资源执行操作的权限。因此,您必须在 admin 数据库中创建角色。

use admin
db.createRole(
{
role: "mongostatRole",
privileges: [
{ resource: { cluster: true }, actions: [ "serverStatus" ] }
],
roles: []
}
)

[2] 内置角色 clusterMonitor 还提供运行 mongostat 的权限以及其他权限。

以下示例会创建一个名为 dropSystemViewsAnyDatabase 的角色,该角色提供在任何数据库中删除 system.views 集合的权限。

1

使用先决条件部分中指定的权限连接到 mongod 或 mongos。

以下过程使用对自管理部署启用访问控制中创建的 myUserAdmin。

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

myUserAdmin 拥有在 admin 和其他数据库中创建角色的权限。

2

为角色指定一项权限,其中包括:

use admin
db.createRole(
{
role: "dropSystemViewsAnyDatabase",
privileges: [
{
actions: [ "dropCollection" ],
resource: { db: "", collection: "system.views" }
}
],
roles: []
}
)

注意

要修改MongoDB Atlas中现有数据库用户的角色,请参阅MongoDB Atlas文档中的管理数据库用户。

  • 必须对数据库执行 grantRole 操作才能在该数据库上授予角色。

  • 必须对数据库执行 revokeRole 动作才能撤消该数据库上的角色。

  • 要查看角色的信息,您必须已被显式授予该角色,或必须有权对该角色的数据库执行 viewRole 操作。

1

以具有前提条件部分指定权限的用户身份连接到 mongod 或 mongos。

以下过程使用对自管理部署启用访问控制中创建的 myUserAdmin。

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2

要显示要修改的用户的角色和权限,请使用 db.getUser() 和 db.getRole() 方法。

例如,要查看在其他示例中创建的 reportsUser 的角色,请发出:

use reporting
db.getUser("reportsUser")

要显示 readWrite 角色在 "accounts" 数据库上授予用户的权限,请发出:

use accounts
db.getRole( "readWrite", { showPrivileges: true } )
3

如果用户需要额外的权限,则向用户授予具有所需权限集的角色。如果不存在这样的角色,请创建一个具有相应权限的新角色。

要撤销现有角色提供的权限子集:撤销原始角色并授予仅包含所需权限的角色。如果角色不存在,则可能需要创建新角色。

4

使用 db.revokeRolesFromUser()方法撤销角色。以下示例操作从 reportsUser 中删除accounts 数据库上的 readWrite 角色:

use reporting
db.revokeRolesFromUser(
"reportsUser",
[
{ role: "readWrite", db: "accounts" }
]
)

使用 db.grantRolesToUser() 方法授予角色。例如,以下操作向 reportsUser 用户授予 accounts 数据库上的 read 角色:

use reporting
db.grantRolesToUser(
"reportsUser",
[
{ role: "read", db: "accounts" }
]
)

对于分片集群,对用户的更改会在运行命令的 mongos 上立即生效。但是,对于集群中的其他 mongos 个实例,用户缓存可能需要等待 10 分钟才能刷新。请参阅 userCacheInvalidationIntervalSecs。

注意

要修改现有MongoDB Atlas用户的密码,请参阅MongoDB Atlas文档中的管理数据库用户。

要修改数据库其他用户的密码,必须对该数据库执行 changePassword 操作。

1

使用 先决条件部分中指定的权限连接到 mongod 或 mongos。

以下过程使用对自管理部署启用访问控制中创建的 myUserAdmin。

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2

将用户的用户名和新密码传递给 db.changeUserPassword() 方法。

以下操作将 reporting 用户的密码更改为 SOh3TbYhxuLiW8ypJPxmt1oOfL:

db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")

注意

要查看用户在MongoDB Atlas中的角色,请参阅MongoDB Atlas文档中的管理数据库用户。

要查看其他用户的信息,必须对其他用户的数据库执行 viewUser 操作。

用户可查看自己的信息。

1

以具有前提条件部分指定权限的用户身份连接到 mongod 或 mongos。

以下过程使用对自管理部署启用访问控制中创建的 myUserAdmin。

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2

使用 usersInfo 命令或 db.getUser() 方法显示用户信息。

例如,要查看在其他示例中创建的 reportsUser 的角色,请发出:

use reporting
db.getUser("reportsUser")

在返回的文档中,roles 字段显示 reportsUser 的所有角色:

...
"roles" : [
{ "role" : "readWrite", "db" : "accounts" },
{ "role" : "read", "db" : "reporting" },
{ "role" : "read", "db" : "products" },
{ "role" : "read", "db" : "sales" }
]

注意

要查看 MongoDB Atlas 中角色的权限,请参阅 MongoDB Atlas 文档中的查看自定义角色。

要查看角色的信息,您必须已被显式授予该角色,或必须有权对该角色的数据库执行 viewRole 操作。

1

以具有前提条件部分指定权限的用户身份连接到 mongod 或 mongos。

以下过程使用对自管理部署启用访问控制中创建的 myUserAdmin。

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2

对于给定角色,请使用 db.getRole() 方法或 rolesInfo 命令以及 showPrivileges 选项:

例如,若要查看 read 角色在 products 数据库上获得的权限,请使用以下操作,发出:

use products
db.getRole( "read", { showPrivileges: true } )

在返回的文档中,privileges 和 inheritedPrivileges 数组。privileges 列出了角色直接指定的权限,不包括从其他角色继承的权限。inheritedPrivileges 列出了此角色授予的所有权限,包括直接指定的权限和继承权限。如果角色不继承自其他角色,则两个字段相同。

...
"privileges" : [
{
"resource": { "db" : "products", "collection" : "" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
},
{
"resource" : { "db" : "products", "collection" : "system.js" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
}
],
"inheritedPrivileges" : [
{
"resource": { "db" : "products", "collection" : "" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
},
{
"resource" : { "db" : "products", "collection" : "system.js" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
}
]