创建用户
启用访问控制后,用户需要表明自己的身份。您必须授予用户一个或多个角色。角色授予用户在 MongoDB资源上执行特定操作的权限。
MongoDB 系统的每个应用程序和用户都应该映射到一个不同的用户。这种访问隔离原则有助于访问撤销和持续的用户维护。为确保系统的最低权限,只授予用户所需的最少权限集。
先决条件
为了能够创建用户,您需要:
对于常规用户创建,您必须拥有以下权限:
和内置角色 在各自的资源userAdmin
上提供 和操作。userAdminAnyDatabase
createUser
grantRole
程序
笔记:
连接和验证
使用
mongosh
,连接到您的主服务器mongod
,或者在分片集群中,连接到您的mongos
并以用户管理员或用户身份进行身份验证所需特权:在连接期间进行身份验证
开始
mongosh
与-u
,-p
, 和--authenticationDatabase
命令行选项:mongosh --port 27017 --authenticationDatabase \ "admin" -u "myUserAdmin" -p
出现提示时输入密码。
连接后验证
使用
mongosh
,连接到您的数据库部署:mongosh --port 27017
在
mongosh
,切换到身份验证数据库(在本例中为admin
),并使用db.auth(, )
方法进行身份验证:use admin db.auth("myUserAdmin", passwordPrompt()) // or cleartext password
提示:
该
passwordPrompt()
方法提示您输入密码。您也可以直接将密码指定为字符串。我们建议使用该passwordPrompt()
方法来避免密码在您的屏幕上可见并可能将密码泄露到您的 shell 历史记录中。出现提示时输入密码。
为您的服务创建额外的用户
笔记:
验证为用户管理员后,使用该
db.createUser()
方法创建其他用户。您可以为用户分配任何内置角色或 用户定义的角色。以下操作将一个用户添加
myTester
到test
数据库中,该用户具有数据库readWrite
中的角色test
以及数据库read
中的角色reporting
。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
重要的:
无法在同一用户之间切换
mongosh
会议。作为不同的用户进行身份验证意味着会话具有两个经过身份验证的用户的特权。在用户退出和重新启动之间切换mongosh
.退出后
mongosh
作为myUserAdmin
,重新连接为myTester
:在连接期间进行身份验证
开始
mongosh
与-u
,-p
, 和--authenticationDatabase
命令行选项:mongosh --port 27017 -u "myTester" \ --authenticationDatabase "test" -p
出现提示时输入用户密码。
连接后验证
mongosh --port 27017
在
mongosh
,切换到身份验证数据库(在本例中为admin
),并使用db.auth(, )
方法进行身份验证:use test db.auth("myTester", passwordPrompt()) // or cleartext password
提示:
该
passwordPrompt()
方法提示您输入密码。您也可以直接将密码指定为字符串。我们建议使用该passwordPrompt()
方法来避免密码在您的屏幕上可见并可能将密码泄露到您的 shell 历史记录中。出现提示时输入用户密码。
插入文档作为
myTester
作为用户
myTester
,您有权在数据库中执行读写操作test
(以及在reporting
数据库中执行读取操作)。验证为 后myTester
,将文档插入test
数据库中的集合。例如,您可以在test
数据库中执行以下插入操作:db.foo.insertOne( { x: 1, y: 1 } )
提示:
也可以看看:
其他示例
用户名/密码认证
以下操作在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
参考外部源进行身份验证。
要对身份验证用户(Kerberos、LDAP 或 x.509 用户)使用客户端会话和因果一致性保证,$external
用户名不能超过 10k 字节。
对于 Kerberos 身份验证,您必须添加 Kerberos 主体作为用户名。您不需要指定密码。
reportingapp@EXAMPLE.NET
以下操作添加了对数据库具有只读访问权限的Kerberos 主体 records
:
use $external
db.createUser(
{
user: "reportingapp@EXAMPLE.NET",
roles: [
{ role: "read", db: "records" }
]
}
)
提示:
也可以看看:
有关为 MongoDB 部署设置 Kerberos 身份验证的更多信息,请参阅以下教程:
LDAP 身份验证
使用外部身份验证机制(例如 LDAP)对 MongoDB 进行身份验证的用户必须在数据库中创建$external
,这允许mongos
或mongod
参考外部源进行身份验证。
要对身份验证用户(Kerberos、LDAP 或 x.509 用户)使用客户端会话和因果一致性保证,$external
用户名不能超过 10k 字节。
对于 LDAP 身份验证,您必须指定用户名。您不需要指定密码,因为它由 LDAP 服务处理。
以下操作添加reporting
对数据库具有只读访问权限的用户records
:
use $external
db.createUser(
{
user: "reporting",
roles: [
{ role: "read", db: "records" }
]
}
)
提示:
也可以看看:
有关为 MongoDB 部署设置 LDAP 身份验证的更多信息,请参阅以下教程:
x.509 客户端证书身份验证
使用外部身份验证机制(例如 x.509 客户端证书身份验证)对 MongoDB 进行身份验证的用户必须在数据库中创建$external
,这允许mongos
或mongod
参考外部源进行身份验证。
要对身份验证用户(Kerberos、LDAP 或 x.509 用户)使用客户端会话和因果一致性保证,$external
用户名不能超过 10k 字节。
对于 x.509 客户端证书身份验证,您必须添加来自客户端证书的值subject
作为 MongoDB 用户。每个唯一的 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 客户端证书身份验证的更多信息,请参阅以下教程:
下一步
要管理用户、分配角色和创建自定义角色,请参阅 管理用户和角色。
翻译:韩鹏帅