db.updateRole()

在本页面

定义

对字段的更新完全取代了前一个字段的值。要在不替换所有值的情况下授予或删除角色或特权,请使用以下一种或多种方法:

警告privilegesroles array 的更新完全取代了之前的 array 值。

updateRole()方法使用以下语法:

db.updateRole(
    "<rolename>",
    {
      privileges:
          [
            { resource: { <resource> }, actions: [ "<action>", ... ] },
            ...
          ],
      roles:
          [
            { role: "<role>", db: "<database>" } | "<role>",
            ...
          ],
      authenticationRestrictions:
          [
            {
              clientSource: ["<IP>" | "<CIDR range>", ...],
              serverAddress: ["<IP>", | "<CIDR range>", ...]
            },
            ...
          ]
    },
    { <writeConcern> }
)

db.updateRole()方法接受以下 arguments:

参数类型描述
rolename要更新的user-defined 角色的 name。
update文献包含角色替换数据的文档。此数据完全替换了角色的相应数据。
writeConcern文献可选的。 写关注的 level 用于更新操作。 writeConcern文档采用与GetLastError 函数命令相同的字段。

update文档指定要更新的字段和新值。 update文档中的每个字段都是可选的,但文档必须至少包含一个字段。 update文档包含以下字段:

领域类型描述
privilegesarray可选的。如果未指定角色 array,则为必需。授予角色的权限。对privileges array 的更新会覆盖先前的 array 值。有关指定权限的语法,请参阅特权 array。
rolesarray可选的。如果未指定特权 array,则为必需。此角色从中继承权限的角色。对roles array 的更新会覆盖先前的 array 值。
authenticationRestrictionsarray可选的。
服务器对该角色强制执行的身份验证限制。指定允许此角色的用户连接到可以连接的 and/or 的 IP 地址和 CIDR 范围的列表。
version 3.6 中的新内容。

db.updateRole()方法包装updateRole命令。

角色

roles字段中,您可以同时指定built-in 角色user-defined 角色

要指定运行db.updateRole()的同一数据库中存在的角色,您可以使用角色的 name 指定角色:

"readWrite"

或者您可以使用文档指定角色,如下所示:

{ role: "<role>", db: "<database>" }

要指定存在于其他数据库中的角色,请使用文档指定角色。

身份验证限制

version 3.6 中的新内容。

authenticationRestrictions文档只能包含以下字段。如果authenticationRestrictions文档包含无法识别的字段,服务器将引发错误:

字段 Name描述
clientSourceArray of IP addresses and/or CIDR 范围如果存在,则在对用户进行身份验证时,服务器会验证 client 的 IP 地址是在给定列表中还是属于列表中的 CIDR 范围。如果 client 的 IP 地址不存在,则服务器不会对用户进行身份验证。
serverAddressArray of IP addresses and/or CIDR 范围client 可以连接的 IP 地址或 CIDR 范围列表。如果存在,服务器将验证是否已通过给定列表中的 IP 地址接受 client 的连接。如果通过无法识别的 IP 地址接受连接,则服务器不会对用户进行身份验证。

重要 如果用户使用不兼容的身份验证限制继承多个角色,则该用户将变得不可用。 例如,如果用户继承了clientSource字段为["198.51.100.0"]的一个角色,而clientSource字段为["203.0.113.0"]的另一个角色,则服务器无法对用户进行身份验证。

有关 MongoDB 中的身份验证的详细信息,请参阅认证

行为

副本集

如果在副本集上运行_r_,则默认使用多数写入关注执行db.updateRole()

范围

除了在admin数据库中创建的角色之外,角色只能包含适用于其数据库的权限,并且只能从其数据库中的其他角色继承。

admin数据库中创建的角色可以包括适用于admin数据库,其他数据库或资源的权限,并且可以从其他数据库中的角色以及admin数据库继承。

必需的访问权

您必须在 order 中的所有数据库上具有revokeRole 行动才能更新角色。

您必须在roles array 中的每个角色的数据库上具有grantRole 行动才能更新 array。

您必须在privileges array 中的每个权限的数据库上具有grantRole 行动才能更新 array。如果权限的资源 spans 数据库,则admin数据库上必须有grantRole。如果权限是以下任何一项,则权限 spans 数据库:

  • 所有数据库中的集合

  • 所有馆藏和所有数据库

  • cluster资源

您必须在目标角色的数据库上具有setAuthenticationRestriction 行动才能更新角色的authenticationRestrictions文档。

以下db.updateRole()方法替换products数据库中存在的inventoryControl角色的特权角色。该方法在包含inventoryControl的数据库上运行:

use products
db.updateRole(
    "inventoryControl",
    {
      privileges:
          [
            {
              resource: { db:"products", collection:"clothing" },
              actions: [ "update", "createCollection", "createIndex"]
            }
          ],
      roles:
          [
            {
              role: "read",
              db: "products"
            }
          ]
    },
    { w:"majority" }
)

要查看角色的权限,请使用rolesInfo命令。