updateRole
定义
updateRole
更新用户定义的角色。
updateRole
命令必须在角色的数据库上运行。提示
在
mongosh
中,该命令也可通过db.updateRole()
辅助方法运行。辅助方法对
mongosh
用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。对字段的更新会完全替换先前字段的值。 要授予或删除角色或权限而不替换所有值,请使用以下一个或多个命令:
警告
对
privileges
或roles
数组的更新将完全替换先前数组的值。updateRole
命令使用以下语法。要更新角色,必须提供privileges
数组和/或roles
数组:{ 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> } updateRole
命令拥有以下字段:字段类型说明updateRole
字符串要更新的用户定义角色的名称。privileges
阵列roles
阵列可选。如果未指定privileges
数组,则为必填项。此角色从中继承权限的角色。roles
数组的更新会覆盖之前数组的值。authenticationRestrictions
阵列可选。 .. include:: /includes/fact-auth-restrictions-role-desc.rstwriteConcern
文档comment
任何可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
mongod 日志消息,位于
attr.command.cursor.comment
字段中。command.comment
字段中的数据库分析器输出。currentOp
输出,在command.comment
字段。
注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。
角色
要指定运行 updateRole
的同一数据库中存在的角色,可以使用角色名称指定角色:
"readWrite"
或者,可以使用文档指定角色,如下所示:
{ role: "<role>", db: "<database>" }
要指定存在于其他数据库中的角色,请使用文档指定该角色。
authenticationRestrictions
版本 3.6 中的新增功能。
authenticationRestrictions
文档只能包含以下字段。如果 authenticationRestrictions
文档包含无法识别的字段,服务器会引发错误:
字段名称 | 值 | 说明 |
---|---|---|
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
。如果权限为以下任一权限,则该权限将跨越数据库:
所有数据库中的一个集合
所有集合和所有数据库
cluster
资源
您必须对目标角色的数据库执行 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
命令。