Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

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

在此页面上

  • 先决条件
  • 创建用户定义的角色
  • 修改现有用户的访问权限
  • 修改现有用户的密码
  • 查看用户角色
  • 查看角色特权

本教程提供了在 MongoDB 授权模型下进行自管理部署的用户和角色管理的示例。要创建新用户,请参阅在自托管部署上创建用户。

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

注意

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

角色授予用户访问 MongoDB 资源的权限。MongoDB 提供了许多内置角色,管理员可以用这些角色来控制对 MongoDB 系统的访问权限。但是,如果这些角色无法描述所需的特权集,您可以在特定数据库中创建新角色。

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

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

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

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

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

  • 对该数据库资源执行 createRole 操作

  • 对该数据库执行 grantRole 操作,用于为新角色指定权限以及指定要从其继承权限的角色。

通过内置角色 userAdminuserAdminAnyDatabase,可在各自的资源上执行 createRolegrantRole 操作。

要在指定 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的角色,该角色提供删除任何数据库中的collection的权限。

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

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

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

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

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

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

use reporting
db.getUser("reportsUser")

要显示"accounts"数据库上的readWrite角色授予用户的权限,请执行以下命令:

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

使用 先决条件部分中指定的权限连接到 mongodmongos

以下过程将使用在对自管理部署启用访问控制中创建的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

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

以下过程将使用在对自管理部署启用访问控制中创建的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

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

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

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

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

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

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

在返回的文档中,privilegesinheritedPrivileges 数组。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" ]
}
]

后退

用户定义的角色