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-1
和SCRAM-SHA-256
。passwordDigestor
字符串可选。指示对密码进行摘要处理的是服务器还是客户端。
可用值为:
"server"
(默认)- 服务器会从客户端接收未加密的密码,然后对此密码进行加密。
"client"
(与SCRAM-SHA-256
不兼容)- 客户端会对该密码进行哈希,并将哈希后的密码传递给服务器。
角色
要指定运行 db.createUser()
的同一数据库中存在的角色,可以使用角色名称指定角色:
"readWrite"
或者,可以使用文档指定角色,如下所示:
{ role: "<role>", db: "<database>" }
要指定存在于其他数据库中的角色,请使用文档指定该角色。
authenticationRestrictions
版本 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 Atlas集群不支持此命令。 有关Atlas支持所有命令的信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
行为
用户 ID
MongoDB 会在创建时自动为用户分配唯一的 userId
。
副本集
如果在副本集上运行,则默认情况下使用 "majority"
写关注执行 db.createUser()
。
加密
警告
默认情况下,db.createUser()
以明文形式将所有指定数据发送到 MongoDB 实例,即使使用 passwordPrompt()
也是如此。使用 TLS 传输加密来保护客户端和服务器之间的通信,包括 db.createUser()
发送的密码。有关启用 TLS 传输加密的操作说明,请参阅为 TLS/SSL 配置 mongod
和 mongos
。
MongoDB 不以明文形式存储密码。仅当未启用 TLS 传输加密时,密码才会在客户端与服务器之间的传输过程中容易受到攻击。
外部档案
在$external
数据库上创建的用户应将档案存储在 MongoDB 外部,例如使用 Kerberos 的 MongoDB Enterprise 安装。
要对$external
身份验证用户(Kerberos、LDAP 或 x.509 用户)使用客户端会话和因果一致性保证,用户名不能大于 10k 字节。
local
Database
不能在本地数据库中创建用户。
必需的访问权限
要在数据库中创建新用户,您必须对该数据库资源执行
createUser
操作。
userAdmin
和 userAdminAnyDatabase
内置角色提供对资源的 createUser
和 grantRole
动作。
示例
以下 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
数据库上的clusterAdmin
和readAnyDatabase
角色针对
products
数据库的readWrite
角色
创建具有角色的用户
以下操作在 products
数据库中创建 accountUser
,并为用户授予readWrite
和dbAdmin
角色。
提示
您可以将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
注意
要使用SCRAM-SHA-256 ,必须将featureCompatibilityVersion
设置为4.0
。 有关 featureCompatibilityVersion 的更多信息,请参阅查看 FeatureCompatibilityVersion和setFeatureCompatibilityVersion
。
以下操作将创建仅具有 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
参数中指定的值。