启用访问控制后,用户需证明自己的身份。您必须授予用户一个或多个 角色。角色可向用户授予对 MongoDB 资源执行特定操作的特权。
MongoDB 系统的每个应用程序和用户都应映射到一个唯一用户。这种访问隔离原则有利于访问撤销和持续的用户维护。为确保最小特权系统,只授予用户所需的最少特权。
除非另有说明,否则此页面上的用户信息适用于以下所有环境中托管的自托管部署:
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
MongoDB Atlas兼容性
以下限制仅适用于 MongoDB Atlas 中托管的部署。如果其中任何限制对您的组织造成问题,请联系 Atlas 支持部门。
您必须使用 Atlas CLI、 Atlas 管理 API、 Atlas 用户界面或支持的 集成来添加、修改或删除MongoDB Atlas集群上的数据库用户。否则, MongoDB Atlas会回滚任何用户修改。要在MongoDB Atlas中添加用户,请参阅MongoDB Atlas文档中的创建数据库用户。
可用的 MongoDB Atlas 内置角色和特定权限支持 MongoDB 命令的子集。有关更多信息,请参阅 M10+ 集群中不支持的命令。
在 MongoDB Atlas 中,每个 MongoDB Atlas 项目最多支持 100 个数据库用户。如果一个项目需要超过 100 个数据库用户,请联系 Atlas 支持部门。
先决条件
要创建用户,您需要:
对于常规用户创建,您必须拥有以下权限:
要在数据库中创建新用户,您必须对数据库资源执行
createUser操作。
userAdmin 和 userAdminAnyDatabase 内置角色提供对资源的 createUser 和 grantRole 动作。
步骤
要为自管理的MongoDB Enterprise或MongoDB Community部署配置数据库用户,请按照以下步骤操作:
连接和身份验证
使用 mongosh,连接到主节点 mongod,或者在分片集群中连接到 mongos,并以用户管理员或具有所需特权的用户身份进行身份验证:
使用mongosh -u
<username>、-p 和 命令行选项启动--authenticationDatabase <database> :
mongosh --port 27017 --authenticationDatabase \ "admin" -u "myUserAdmin" -p
根据提示输入密码。
使用 mongosh 连接到您的数据库部署:
mongosh --port 27017
在mongosh中,切换到身份验证数据库(在本例中为admin ),并使用db.auth(<username>, <pwd>)方法进行身份验证:
use admin db.auth("myUserAdmin", passwordPrompt()) // or cleartext password
提示
该 passwordPrompt() 方法会提示您输入密码。您也可以直接将密码指定为字符串。我们建议您使用 passwordPrompt() 方法,避免将密码显示在屏幕上,也避免可能将密码泄露到 Shell 历史记录中。
根据提示输入密码。
为部署创建其他用户
以用户管理员身份进行身份验证后,使用 db.createUser() 方法创建其他用户。您可以向用户分配任何内置角色或用户定义的角色。
以下操作将用户 myTester 添加到 test 数据库,该用户在 test 数据库中具有 readWrite 角色,在 reporting 数据库中具有 read 角色。
use test db.createUser( { user: "myTester", pwd: passwordPrompt(), // or cleartext password roles: [ { role: "readWrite", db: "test" }, { role: "read", db: "reporting" } ] } )
提示
该 passwordPrompt() 方法会提示您输入密码。您也可以直接将密码指定为字符串。我们建议您使用 passwordPrompt() 方法,避免将密码显示在屏幕上,也避免可能将密码泄露到 Shell 历史记录中。
在其内创建此用户的数据库(在此示例中为 test)便是该用户的身份验证数据库。虽然此用户会通过此数据库的身份验证,但该用户还可能会在其他数据库中拥有角色。此用户的身份验证数据库不会限制该用户的特权。
在创建该新增用户后,请退出 mongosh。
连接到此实例并以 myTester
以 myUserAdmin 身份退出 mongosh 后,以 myTester 身份重新连接:
使用mongosh -u
<username>、-p 和 命令行选项启动--authenticationDatabase <database> :
mongosh --port 27017 -u "myTester" \ --authenticationDatabase "test" -p
根据提示输入用户密码。
使用 mongosh 连接到您的数据库部署:
mongosh --port 27017
在mongosh中,切换到身份验证数据库(在本例中为admin ),并使用db.auth(<username>, <pwd>)方法进行身份验证:
use test db.auth("myTester", passwordPrompt()) // or cleartext password
提示
该 passwordPrompt() 方法会提示您输入密码。您也可以直接将密码指定为字符串。我们建议您使用 passwordPrompt() 方法,避免将密码显示在屏幕上,也避免可能将密码泄露到 Shell 历史记录中。
根据提示输入用户密码。
其他示例
用户名/密码验证
以下操作将在 reporting 数据库中创建具有指定名称、密码和角色的用户。
提示
该 passwordPrompt() 方法会提示您输入密码。您也可以直接将密码指定为字符串。我们建议您使用 passwordPrompt() 方法,避免将密码显示在屏幕上,也避免可能将密码泄露到 Shell 历史记录中。
use reporting db.createUser( { user: "reportsUser", pwd: passwordPrompt(), // or cleartext password roles: [ { role: "read", db: "reporting" }, { role: "read", db: "products" }, { role: "read", db: "sales" }, { role: "readWrite", db: "accounts" } ] } )
Kerberos 身份验证
使用外部身份验证机制(例如 Kerberos)进行 MongoDB 身份验证的用户,必须在 $external 数据库中创建,这样 mongos 或 mongod 可以咨询外部来源进行身份验证。
要对$external身份验证用户(Kerberos、LDAP 或 x.509 用户)使用客户端会话和因果一致性保证,用户名不能大于 10k 字节。
对于 Kerberos 身份验证,您必须添加 Kerberos 主体作为用户名。您不需要指定密码。
以下操作将有只读访问权限的 Kerberos 主体 reportingapp@EXAMPLE.NET 添加至 records 数据库:
use $external db.createUser( { user: "reportingapp@EXAMPLE.NET", roles: [ { role: "read", db: "records" } ] } )
提示
有关为 MongoDB 部署设置 Kerberos 身份验证的更多信息,请参阅以下教程:
LDAP 身份验证
使用外部身份验证机制(例如 LDAP)进行 MongoDB 身份验证的用户,必须在 $external 数据库中创建,这样 mongos 或 mongod 可以咨询外部来源进行身份验证。
要对$external身份验证用户(Kerberos、LDAP 或 x.509 用户)使用客户端会话和因果一致性保证,用户名不能大于 10k 字节。
对于 LDAP 身份验证,您必须指定用户名。您无需指定密码,因为这将由 LDAP 服务处理。
以下操作会添加对 records数据库拥有只读访问权限的 reporting 用户:
use $external db.createUser( { user: "reporting", roles: [ { role: "read", db: "records" } ] } )
提示
有关为 MongoDB 部署设置 LDAP 身份验证的更多信息,请参阅以下教程:
x.509 客户端证书身份验证
使用外部身份验证机制(例如 x.509 客户端证书身份验证)进行 MongoDB 身份验证的用户,必须在 $external 数据库中创建,这样 mongos 或 mongod 可以咨询外部来源进行身份验证。
要对$external身份验证用户(Kerberos、LDAP 或 x.509 用户)使用客户端会话和因果一致性保证,用户名不能大于 10k 字节。
对于 x.509 客户端证书身份验证,您必须以 MongoDB 用户身份从客户端证书中添加 subject 的值。每个唯一的 x.509 客户端证书对应一个 MongoDB 用户。您不需要指定密码。
以下操作将具有只读访问权限的客户端证书主题 CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry 用户添加至 records 数据库。
use $external db.createUser( { user: "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry", roles: [ { role: "read", db: "records" } ] } )
提示
有关为 MongoDB 部署设置 x.509 客户端证书身份验证的更多信息,请参阅以下教程:
后续步骤
要为自管理的MongoDB Enterprise或MongoDB Community部署管理用户、分配角色和创建自定义角色,请参阅管理自管理部署的用户和角色。