updateUser
定义
updateUser
更新您在运行的命令所在的数据库上的用户配置文件。字段的更新会完全替换先前的字段值,包括更新用户的
roles
和authenticationRestrictions
数组。提示
在
mongosh
中,此命令也可以通过db.changeUserPassword()
辅助方法运行.辅助方法对
mongosh
用户来说很方便,但它们可能不会返回与数据库命令相同级别的信息。在不需要便利性或需要额外的返回字段的情况下,请使用数据库命令。警告
当更新
roles
数组时,您将完全替换先前的数组值。要添加或删除角色而不替换用户的所有现有角色,请使用grantRolesToUser
或revokeRolesFromUser
命令。要更新用户,您必须指定
updateUser
字段以及至少一个其他字段,但不能是writeConcern
。
兼容性
此命令在以下环境中托管的部署中可用
MongoDB Atlas:云中MongoDB部署的完全托管服务
重要
此命令不支持M0、M2、M5和M10+集群。有关更多信息,请参阅不受支持的命令。
MongoDB Enterprise:基于订阅的自托管MongoDB版本
MongoDB Community:源代码可用、免费使用并自托管的MongoDB版本
语法
命令使用以下语法
db.runCommand( { updateUser: "<username>", pwd: passwordPrompt(), // Or "<cleartext password>" customData: { <any information> }, roles: [ { role: "<role>", db: "<database>" } | "<role>", ... ], authenticationRestrictions: [ { clientSource: ["<IP>" | "<CIDR range>", ...], serverAddress: ["<IP>", | "<CIDR range>", ...] }, ... ], mechanisms: [ "<scram-mechanism>", ... ], digestPassword: <boolean>, writeConcern: { <write concern> }, comment: <any> } )
命令字段
命令接受以下字段
字段 | 类型 | 描述 |
---|---|---|
updateUser | string | 要更新的用户名。 |
pwd | string | 可选。用户的密码。值可以是
|
customData | document | 可选。任何任意信息。 |
roles | 数组 | 可选。授予用户的角色。对 roles 数组的更新将覆盖之前数组的值。 |
writeConcern | document | |
authenticationRestrictions | 数组 | 可选。服务器对用户执行的身份验证限制。指定允许用户连接到服务器或服务器可以接受用户的IP地址列表和CIDR 范围。 |
mechanisms | 数组 | 可选。用户凭据的具体SCRAM机制或机制。如果指定了 如果没有密码更新机制字段,则只能指定用户当前机制的子集,并且仅保留指定机制或机制的现有用户凭据。 如果同时更新密码和机制,则将为用户存储新的凭证集。 有效值有
|
digestPassword | 布尔值 | 可选。指示服务器或客户端是否对密码进行摘要。 如果为 如果为 |
comment | 任何 | 可选。用户提供的附加到此命令的注释。设置后,此注释将在以下位置显示此命令的记录
注释可以是任何有效的 BSON 类型(字符串、整数、对象、数组等)。 |
角色
在 roles
字段中,您可以指定内置角色和 用户定义的角色。
要指定与运行 updateUser
的同一数据库中存在的角色,您可以指定角色的名称
"readWrite"
或者您可以使用文档指定角色,如下所示
{ role: "<role>", db: "<database>" }
要指定不同数据库中存在的角色,请使用文档指定角色。
身份验证限制
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身份验证的更多信息,请参阅 自托管部署的身份验证。
行为
警告
默认情况下,updateUser
会将所有指定数据以明文形式发送到MongoDB实例,即使使用了passwordPrompt()
。使用TLS传输加密来保护客户端和服务器之间的通信,包括由updateUser
发送的密码。有关启用TLS传输加密的说明,请参阅配置mongod
和mongos
以TLS/SSL。
MongoDB不会以明文形式存储密码。密码在客户端和服务器之间传输时才易受攻击,并且仅在未启用TLS传输加密的情况下。
所需访问权限
您必须拥有包括所有数据库的revokeRole
操作的访问权限,才能更新用户的roles
数组。
您必须拥有角色的数据库上的grantRole
操作权限,才能将角色添加到用户。
要更改其他用户的pwd
或customData
字段,您必须在该用户数据库上拥有相应的changePassword
和changeCustomData
操作权限。
要修改您自己的密码和自定义数据,您必须在用户的数据库上拥有授予 changeOwnPassword
和 changeOwnCustomData
操作 的权限。
示例
假设 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" ] }
以下 updateUser
命令会**完全**替换用户的 customData
和 roles
数据。
use products db.runCommand( { 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" ] }