Docs 菜单

Docs 主页开发应用程序MongoDB Manual

db.updateUser()

在此页面上

  • 定义
  • 行为
  • 必需的访问权限
  • 例子
db.updateUser( username, update, writeConcern )

更新运行该方法的数据库上的用户配置文件。字段更新将完全替换先前字段的值。这包括对用户的roles数组的更新。

警告

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

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

提示

mongo Shell 的 4.2 版开始,您可以将passwordPrompt()方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。 不过,您仍然可以像使用早期版本的mongo Shell 一样直接指定密码。

db.updateUser(
"<username>",
{
customData : { <any information> },
roles : [
{ role: "<role>", db: "<database>" } | "<role>",
...
],
pwd: passwordPrompt(), // Or "<cleartext password>"
authenticationRestrictions: [
{
clientSource: ["<IP>" | "<CIDR range>", ...],
serverAddress: ["<IP>", | "<CIDR range>", ...]
},
...
],
mechanisms: [ "<SCRAM-SHA-1|SCRAM-SHA-256>", ... ],
passwordDigestor: "<server|client>"
},
writeConcern: { <write concern> }
)

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

范围
类型
说明
username
字符串
要更新的用户的名称。
update
文档
一份包含该用户替换数据的文档。该数据完全替代该用户的相应数据。
writeConcern
文档

可选。操作的写关注级别。请参阅写关注规范

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

update 文档包含以下字段:

字段
类型
说明
customData
文档
可选。任意信息。
roles
阵列
可选。 授予用户的角色。 roles数组的更新会覆盖之前数组的值。
pwd
字符串

可选。用户的密码。该值可为:

  • 以明文字符串表示的用户密码,或

  • passwordPrompt() 提示输入用户密码。

提示

mongo Shell 的 4.2 版开始,您可以将passwordPrompt()方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。 不过,您仍然可以像使用早期版本的mongo Shell 一样直接指定密码。

authenticationRestrictions
阵列

可选。服务器对用户实施的身份验证限制。指定 IP 地址和 CIDR 范围列表,允许这些地址和范围的用户连接至服务器或者服务器接受这些用户。

版本 3.6 中的新增功能

mechanisms
阵列

可选。针对用户档案的特定 SCRAM 机制。如果指定了 authenticationMechanisms,则只能指定部分 authenticationMechanisms

如果在没有密码的情况下更新机制字段,则只能指定用户当前机制的子集,并且仅保留指定机制或机制的现有用户档案。

如果同时更新密码和机制,则会为用户存储一组新的档案。

有效值为:

  • "SCRAM-SHA-1"

    • 使用 SHA-1 哈希函数。

  • "SCRAM-SHA-256"

    • 使用 SHA-256 哈希函数。

    • 需将 featureCompatibilityVersion 设为 4.0

    • 要求 passwordDigestor 为server

passwordDigestor
字符串

可选。指示对密码进行摘要处理的是服务器还是客户端。

可用值为:

  • "server" (默认)
    服务器会从客户端接收未加密的密码,然后对此密码进行加密。
  • "client" (与 SCRAM-SHA-256 不兼容)
    客户端会对该密码进行哈希,并将哈希后的密码传递给服务器。

roles 字段中,可以指定内置角色用户自定义角色

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

"readWrite"

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

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

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

版本 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 中身份验证的更多信息,请参阅身份验证

db.updateUser()方法封装了updateUser命令。

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

警告

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

MongoDB 不以明文形式存储密码。仅当未启用 TLS 传输加密时,密码才会在客户端与服务器之间的传输过程中容易受到攻击。

要更新用户的 roles 数组,您必须具有包含所有数据库上的revokeRole动作的访问权限。

必须对某一角色的数据库执行 grantRole 操作才能向用户添加角色。

要更改其他用户的 pwdcustomData 字段,必须对该用户的数据库分别执行 changePasswordchangeCustomData 操作

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

假定在 products 数据库中有用户 appClient01,其用户信息如下:

{
_id : "products.appClient01",
userId : UUID("c5d88855-3f1e-46cb-9c8b-269bef957986"),
user : "appClient01",
db : "products",
customData : { empID : "12345", badge : "9156" },
roles : [
{
role : "readWrite",
db : "products"
},
{
role : "read",
db : "inventory"
}
],
mechanisms : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
],
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"),
user : "appClient01",
db : "products",
customData : { employeeId : "0x3039" },
roles : [
{
role : "read",
db : "assets"
}
],
mechanisms : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
],
authenticationRestrictions : [ {
clientSource: ["69.89.31.226"],
serverAddress: ["172.16.254.1"]
} ]
}

注意

要使用SCRAM-SHA-256 ,必须将featureCompatibilityVersion设置为4.0 。 有关 featureCompatibilityVersion 的更多信息,请参阅查看 FeatureCompatibilityVersionsetFeatureCompatibilityVersion

以下操作会将当前同时拥有 SCRAM-SHA-256SCRAM-SHA-1 档案的用户更新为仅拥有 SCRAM-SHA-256 档案。

注意

  • 如果密码没有与 mechanisms 一起指定,则只能将 mechanisms 更新为用户当前 SCRAM 机制的子集。

  • 如果密码与 mechanisms 一起指定,您可以指定任何受支持的 SCRAM 机制。

  • 对于 SCRAM-SHA-256passwordDigestor 必须是默认值 "server"

use reporting
db.updateUser(
"reportUser256",
{
mechanisms: [ "SCRAM-SHA-256" ]
}
)
← db.revokeRolesFromUser()