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

使用先决条件部分中指定的权限连接到 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() 方法。

例如,要查看在其他示例中创建的 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

使用 先决条件部分中指定的权限连接到 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() 方法或 rolesInfo 命令以及 showPrivileges 选项:

例如,若要查看 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" ]
}
]

后退

用户定义角色