更新角色
定义
updateRole
更新用户定义的角色。必须在该角色的数据库上运行
updateRole
命令。提示
在
mongosh
中,此命令还可以通过db.updateRole()
辅助方法运行.辅助方法对于
mongosh
用户来说很方便,但它们可能不会返回与数据库命令相同级别的信息。在不需要便利性或需要额外返回字段的情况下,请使用数据库命令。字段更新会完全替换先前字段的值。要授予或移除角色或 权限 而不替换所有值,请使用以下一个或多个命令
注意
更新
privileges
或roles
数组会完全替换先前数组的值。
兼容性
此命令可在以下环境中托管的部署中使用
MongoDB Atlas:云中MongoDB部署的完全托管服务
重要
此命令不支持M0、M2、M5和M10+集群。更多信息,请参阅不支持命令。
MongoDB企业版:基于订阅的MongoDB自管理版本
MongoDB社区版:开源、免费使用、自管理的MongoDB版本
语法
要更新角色,您必须提供privileges
数组、roles
数组或两者。
该命令使用以下语法
db.runCommand( { updateRole: "<role>", privileges: [ { resource: { <resource> }, actions: [ "<action>", ... ] }, ... ], roles: [ { role: "<role>", db: "<database>" } | "<role>", ... ], authenticationRestrictions: [ { clientSource: ["<IP>" | "<CIDR range>", ...], serverAddress: ["<IP>", ...] }, ... ] writeConcern: <write concern document>, comment: <any> } )
命令字段
该命令采用以下字段
字段 | 类型 | 描述 |
---|---|---|
更新角色 | string | 要更新的用户定义角色角色的名称。 |
privileges | array | |
roles | array | 可选。如果不指定 privileges 数组,则为必需。此角色从中继承权限的角色。对 roles 数组的更新会覆盖先前数组的值。 |
authenticationRestrictions | array | 可选。 服务器对角色强制执行的认证限制。指定允许用户连接到的 IP 地址列表和CIDR 范围,以及他们可以从哪里连接。 |
writeConcern | document | 可选。操作的写入关注级别。请参阅 写入关注说明。 |
comment | any | 可选。用户为此命令提供的注释。一旦设置,此注释将出现在以下位置的相关记录旁边
注释可以是任何有效的 BSON 类型(字符串、整数、对象、数组等)。 |
Roles
在 roles
字段中,您可以指定内置角色和 用户定义的角色。
要指定与 updateRole
运行的数据库相同的数据库中存在的角色,您可以使用角色的名称指定该角色
"readWrite"
或者您可以使用文档指定该角色,如下所示
{ role: "<role>", db: "<database>" }
要指定在另一个数据库中存在的角色,请使用文档指定该角色。
身份验证限制
身份验证限制文档只能包含以下字段。如果身份验证限制文档包含服务器无法识别的字段,则服务器会抛出错误。
字段名称 | 值 | 描述 |
---|---|---|
clientSource | IP地址和/或CIDR范围的数组 | 如果存在,当验证用户身份时,服务器会检查客户端的IP地址是否在给定的列表中,或者是否属于列表中的CIDR范围。如果客户端的IP地址不在列表中,服务器将不会验证用户身份。 |
serverAddress | IP地址和/或CIDR范围的数组 | 客户端可以连接的IP地址或CIDR范围的列表。如果存在,服务器将验证客户端的连接是否是通过给定的列表中的IP地址接受的。如果通过未识别的IP地址接受连接,则服务器不会验证用户身份。 |
重要
如果一个用户继承多个具有不兼容身份验证限制的角色,则该用户将不可用。
例如,如果一个用户继承了一个角色,其中clientSource
字段为["198.51.100.0"]
,另一个角色的clientSource
字段为["203.0.113.0"]
,则服务器无法验证该用户。
有关MongoDB中身份验证的更多信息,请参阅自管理部署的身份验证。
行为
角色的权限适用于创建角色的数据库。该角色可以从其数据库中的其他角色继承权限。在admin
数据库上创建的角色可以包含适用于所有数据库或集群的权限,并可以继承来自其他数据库的角色的权限。
所需访问权限
您必须拥有所有数据库上的 revokeRole
操作 才能更新角色。
您必须拥有 roles
数组中每个角色的数据库上的 grantRole
操作 才能更新数组。
您必须拥有 privileges
数组中每个权限的数据库上的 grantRole
操作 才能更新数组。如果权限的资源跨越数据库,您必须在 admin
数据库上拥有 grantRole
。以下权限跨越数据库:
所有数据库中的集合
所有集合和所有数据库
集群资源
您必须在目标角色的数据库上拥有 setAuthenticationRestriction
操作 才能更新角色的 authenticationRestrictions
文档。
示例
以下是一个更新 admin
数据库上的 myClusterwideAdmin
角色的 updateRole
命令的示例。虽然 privileges
和 roles
数组都是可选的,但至少需要两个中的一个。
db.adminCommand( { updateRole: "myClusterwideAdmin", privileges: [ { resource: { db: "", collection: "" }, actions: [ "find" , "update", "insert", "remove" ] } ], roles: [ { role: "dbAdminAnyDatabase", db: "admin" } ], writeConcern: { w: "majority" } } )
要查看角色的权限,请使用 rolesInfo
命令。