Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

db.createUser()

在此页面上

  • 定义
  • 兼容性
  • 行为
  • 必需的访问权限
  • 示例
db.createUser(user, writeConcern)

为运行该方法的数据库创建新用户。如果数据库中已存在用户,则 db.createUser() 返回重复用户错误。

db.createUser() 方法使用的语法如下:

字段
类型
说明
user
文档
包含有关要创建的用户的身份验证和访问权限信息的文档。
writeConcern
文档

可选。 该操作的写关注(write concern)级别。 请参阅写关注规范。

user 文档定义用户并具有以下形式:

提示

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

{
user: "<name>",
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-SHA-1|SCRAM-SHA-256>", ... ],
passwordDigestor: "<server|client>"
}

user 文档包含以下字段:

字段
类型
说明
user
字符串
新用户的名称。
pwd
字符串

用户的密码。如果您在 $external 数据库上运行 db.createUser(),以创建凭证存储在 MongoDB 外部的用户,则无需 pwd 字段。

该值可为以下任一项:

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

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

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

customData
文档
可选。任意信息。此字段可用于存储管理员希望与此特定用户关联的任何数据。例如,这可以是用户的全名或员工 ID。
roles
阵列
授予用户的角色。可以指定一个空数组 [],以创建无角色的用户。
阵列

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

版本 3.6 中的新增功能

mechanisms
阵列

可选。指定特定的 SCRAM 机制或用于创建 SCRAM 用户档案的机制。如果指定了authenticationMechanisms,则只能指定authenticationMechanisms的子集。

有效值为:

  • "SCRAM-SHA-1"

    • 使用 SHA-1 哈希函数。

  • "SCRAM-SHA-256"

    • 使用 SHA-256 哈希函数。

    • 要求 passwordDigestor 为server

默认为 SCRAM-SHA-1SCRAM-SHA-256

passwordDigestor
字符串

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

可用值为:

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

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

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

"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.createUser() 方法封装了 createUser 命令。

此方法可用于以下环境中托管的部署:

MongoDB 会在创建时自动为用户分配唯一的 userId

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

警告

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

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

$external数据库上创建的用户应将档案存储在 MongoDB 外部,例如使用 Kerberos 的 MongoDB Enterprise 安装。

要对$external身份验证用户(Kerberos、LDAP 或 x.509 用户)使用客户端会话和因果一致性保证,用户名不能大于 10k 字节。

不能在本地数据库中创建用户。

userAdminuserAdminAnyDatabase 内置角色提供对资源createUsergrantRole 动作。

以下 db.createUser() 操作在 products 数据库中创建 accountAdmin01 用户。

提示

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

use products
db.createUser( { user: "accountAdmin01",
pwd: passwordPrompt(), // Or "<cleartext password>"
customData: { employeeId: 12345 },
roles: [ { role: "clusterAdmin", db: "admin" },
{ role: "readAnyDatabase", db: "admin" },
"readWrite"] },
{ w: "majority" , wtimeout: 5000 } )

此操作会赋予 accountAdmin01 以下角色:

  • admin 数据库上的 clusterAdminreadAnyDatabase 角色

  • 针对 products 数据库的 readWrite 角色

以下操作在 products 数据库中创建 accountUser ,并为用户授予readWritedbAdmin角色。

提示

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

use products
db.createUser(
{
user: "accountUser",
pwd: passwordPrompt(), // Or "<cleartext password>"
roles: [ "readWrite", "dbAdmin" ]
}
)

以下操作在 admin 数据库中创建名为 reportsUser 的用户,但尚未分配角色:

提示

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

use admin
db.createUser(
{
user: "reportsUser",
pwd: passwordPrompt(), // Or "<cleartext password>"
roles: [ ]
}
)

以下操作在 admin 数据库中创建名为 appAdmin 的用户,并为该用户授予对 config 数据库的 readWrite 访问权限,这将允许该用户更改分片集群的某些设置,例如负载均衡器设置。

提示

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

use admin
db.createUser(
{
user: "appAdmin",
pwd: passwordPrompt(), // Or "<cleartext password>"
roles:
[
{ role: "readWrite", db: "config" },
"clusterAdmin"
]
}
)

以下操作将在 admin 数据库中创建名为 restricted 的用户。仅当从 IP 地址 192.0.2.0 连接到 IP 地址 198.51.100.0 时,该用户才会进行身份验证。

提示

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

use admin
db.createUser(
{
user: "restricted",
pwd: passwordPrompt(), // Or "<cleartext password>"
roles: [ { role: "readWrite", db: "reporting" } ],
authenticationRestrictions: [ {
clientSource: ["192.0.2.0"],
serverAddress: ["198.51.100.0"]
} ]
}
)

注意

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

以下操作将创建仅具有 SCRAM-SHA-256 档案的用户。

提示

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

use reporting
db.createUser(
{
user: "reportUser256",
pwd: passwordPrompt(), // Or "<cleartext password>"
roles: [ { role: "readWrite", db: "reporting" } ],
mechanisms: [ "SCRAM-SHA-256" ]
}
)

如果设置了 authenticationMechanisms 参数,mechanisms 字段则只能包含 authenticationMechanisms 参数中指定的值。

后退

db.changeUserPassword