db.updateRole()

在本页面

Definition

对字段的更新 完全替换 先前字段的值。要授予或删除角色或privileges而不替换所有值,请使用以下一种或多种方法:

Warning

privilegesroles数组的更新完全替换了先前数组的值。

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()方法接受以下参数:

Parameter Type Description
rolename string 要更新的user-defined role的名称。
update document 包含角色替换数据的文档。此数据将完全替换角色的相应数据。
writeConcern document 可选的。更新操作的write concern级别。 writeConcern文档具有与getLastError命令相同的字段。

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

Field Type Description
privileges array 可选的。如果未指定roles数组,则为必需。授予角色的特权。 privileges数组的更新将覆盖前一个数组的值。有关指定特权的语法,请参见privileges数组。
roles array 可选的。如果未指定privileges数组,则为必需。该角色从中继承特权的角色。对roles数组的更新将覆盖以前的数组的值。
authenticationRestrictions array Optional.


服务器对角色强制执行的身份验证限制。指定允许授予此角色的用户连接和/或可以从其连接的 IP 地址和 CIDR 范围的列表。
3.6 版中的新功能。

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

Roles

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

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

"readWrite"

或者,您可以通过文档指定角色,如:

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

要指定存在于其他数据库中的角色,请与文档一起指定该角色。

Authentication Restrictions

3.6 版的新功能。

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

Field Name Value Description
clientSource IP 地址和/或 CIDR 范围的数组 如果存在,则在验证用户身份时,服务器将验证 Client 端的 IP 地址在给定列表中或属于列表中的 CIDR 范围。如果 Client 端的 IP 地址不存在,则服务器不会对用户进行身份验证。
serverAddress IP 地址和/或 CIDR 范围的数组 Client 端可以连接的 IP 地址或 CIDR 范围的列表。如果存在,服务器将通过给定列表中的 IP 地址验证是否接受了 Client 端的连接。如果通过无法识别的 IP 地址接受了连接,则服务器不会对用户进行身份验证。

Important

如果用户继承具有不兼容身份验证限制的多个角色,则该用户将变得无法使用。

例如,如果用户继承一个角色,其中clientSource字段是["198.51.100.0"],而另一个角色则继承clientSource字段是["203.0.113.0"],则服务器将无法对该用户进行身份验证。

有关 MongoDB 中身份验证的更多信息,请参阅Authentication

Behavior

Replica set

如果在副本集上运行,默认情况下将使用majority写关注来执行db.updateRole()

Scope

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

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

Required Access

您必须在所有数据库上都拥有revokeRole action才能更新角色。

您必须在roles数组中每个角色的数据库上拥有grantRole action才能更新该数组。

您必须在privileges数组中每个特权的数据库上拥有grantRole action才能更新该数组。如果特权的资源跨越数据库,则admin数据库上必须具有grantRole。如果特权是以下任意一项,则特权跨越数据库:

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

Example

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

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

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

首页