文档菜单
文档首页
/
MongoDB 手册
/ / /

在自管理部署上管理用户和角色

本页内容

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

本教程提供了在 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

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

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

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

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

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

以下过程使用了在 启用自托管部署的访问控制 中创建的 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() 方法。

例如,要查看在 Additional Examples 中创建的 reportsUser 的角色,请执行

use reporting
db.getUser("reportsUser")

要显示对 "accounts" 数据库上由 readWrite 角色授予的权限,请执行

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

如果用户需要额外的权限,则授予用户具有所需权限集的角色或角色。如果不存在这样的角色,请 创建新角色 并设置适当的权限集。

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

4

使用 db.revokeRolesFromUser() 方法撤销角色。以下示例操作从 accounts 数据库中撤销了 reportsUserreadWrite 角色。

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() 方法来显示用户信息。

例如,要查看在 Additional Examples 中创建的 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

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

例如,要查看在 products 数据库上由 read 角色授予的权限,使用以下操作,执行

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" ]
}
]

返回

用户定义角色