db.updateUser()

在本页面

Definition

Warning

更新roles数组时,将完全替换先前数组的值。要添加或删除角色而不替换所有用户现有角色,请使用db.grantRolesToUser()db.revokeRolesFromUser()方法。

db.updateUser()方法使用以下语法:

db.updateUser(
   "<username>",
   {
     customData : { <any information> },
     roles : [
       { role: "<role>", db: "<database>" } | "<role>",
       ...
     ],
     pwd: "<cleartext password>",
     authenticationRestrictions: [
        {
          clientSource: ["<IP>" | "<CIDR range>", ...],
          serverAddress: ["<IP>", | "<CIDR range>", ...]
        },
        ...
     ]
   },
   writeConcern: { <write concern> }
)

db.updateUser()方法具有以下参数。

Parameter Type Description
username string 要更新的用户名。
update document 包含用户替换数据的文档。该数据完全替代了用户的相应数据。
writeConcern document 可选的。更新操作的write concern级别。 writeConcern文档具有与getLastError命令相同的字段。

update文档指定要更新的字段及其新值。 update文档中的所有字段都是可选的,但必须至少包含一个字段。

update文档具有以下字段:

Field Type Description
customData document 可选的。任何任意信息。
roles array 可选的。授予用户的角色。 roles数组的更新将覆盖以前的数组的值。
pwd string 可选的。用户密码。
authenticationRestrictions array 可选的。服务器对用户实施的身份验证限制。指定允许用户连接到服务器或服务器可以接受用户的 IP 地址和 CIDR 范围的列表。


3.6 版中的新功能。

Roles

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

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

"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

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

Behavior

Replica set

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

Encyption

Warning

默认情况下,db.updateUser()以明文形式将所有指定的数据发送到 MongoDB 实例。使用 TLS 传输加密来保护 Client 端和服务器之间的通信,包括db.updateUser()发送的密码。有关启用 TLS 传输加密的说明,请参见为 TLS/SSL 配置 mongod 和 mongos

MongoDB 不会以明文形式存储密码。仅在未启用 TLS 传输加密的情况下,该密码仅在 Client 端和服务器之间的传输中容易受到攻击。

Required Access

您必须具有在所有数据库上包括revokeRole action的访问权限,才能更新用户的roles数组。

您必须在角色的数据库上拥有grantRole action才能向用户添加角色。

要更改另一个用户的pwdcustomData字段,您必须在该用户的数据库上分别拥有changeAnyPasswordchangeAnyCustomData actions

要修改您自己的密码和自定义数据,您必须具有分别在用户数据库上授予changeOwnPasswordchangeOwnCustomData actions的特权。

Example

products数据库中的用户appClient01提供以下用户信息:

{
   _id : "products.appClient01",
   userId : UUID("c5d88855-3f1e-46cb-9c8b-269bef957986"), // Starting in MongoDB 3.6.13
   user : "appClient01",
   db : "products",
   customData : { empID : "12345", badge : "9156" },
   roles : [
       {
         role : "readWrite",
         db : "products"
       },
       {
         role : "read",
         db : "inventory"
       }
   ],
   authenticationRestrictions : [ {
      clientSource: ["69.89.31.226"],
      serverAddress: ["172.16.254.1"]
   } ]
}

以下db.updateUser()方法“完全” **替换了用户的customDataroles数据:

use products
db.updateUser( "appClient01",
{
   customData : { employeeId : "0x3039" },
   roles : [
      { role : "read", db : "assets"  }
   ]
} )

现在,products数据库中的用户appClient01具有以下用户信息:

{
   _id : "products.appClient01",
   userId : UUID("c5d88855-3f1e-46cb-9c8b-269bef957986"), // Starting in MongoDB 3.6.13
   user : "appClient01",
   db : "products",
   customData : { employeeId : "0x3039" },
   roles : [
       {
         role : "read",
         db : "assets"
       }
   ],
   authenticationRestrictions : [ {
      clientSource: ["69.89.31.226"],
      serverAddress: ["172.16.254.1"]
   } ]
}
首页