Enable Auth
在本页面
Overview
在 MongoDB 部署上启用访问控制会强制执行身份验证,要求用户标识自己。访问启用了访问控制的 MongoDB 部署时,用户只能执行由其角色确定的操作。
对于身份验证,MongoDB 支持各种Authentication Mechanisms。
以下教程在独立的mongod实例上启用访问控制,并使用默认身份验证机制。
副本集和分片群集
启用访问控制后,副本集和分片群集需要成员之间的内部身份验证。有关更多详细信息,请参阅Internal Authentication。
User Administrator
启用访问控制后,请确保您在admin
数据库中拥有一个具有userAdmin或userAdminAnyDatabase角色的用户。该用户可以 Management 用户和角色,例如:创建用户,向用户授予或撤消角色,以及创建或修改海关角色。
您可以在启用访问控制之前或之后创建用户。如果在创建任何用户之前启用访问控制,则 MongoDB 将提供localhost exception,它允许您在admin
数据库中创建用户 Management 员。创建后,您必须通过用户 Management 员身份验证才能根据需要创建其他用户。
Procedure
以下过程首先将用户 Management 员添加到在没有访问控制的情况下运行的 MongoDB 实例,然后启用访问控制。
在没有访问控制的情况下启动 MongoDB。
例如,以下代码将启动一个没有访问控制的独立mongod实例。
mongod --port 27017 --dbpath /data/db1
连接到实例。
例如,将mongo shell 连接到实例。
mongo --port 27017
根据需要指定其他命令行选项以将mongo shell 连接到您的部署,例如--host
。
创建用户 Management 员。
在admin
数据库中,添加具有userAdminAnyDatabase角色的用户。根据需要为此用户添加其他角色。例如,下面的代码在admin
数据库中以userAdminAnyDatabase角色和readWriteAnyDatabase角色创建用户myUserAdmin
。
Note
创建用户的数据库(在本示例中为admin
)是用户的authentication database。尽管用户将对此数据库进行身份验证,但是该用户可以在其他数据库中扮演角色;即用户的身份验证数据库不限制用户的特权。
use admin
db.createUser(
{
user: "myUserAdmin",
pwd: "abc123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
}
)
断开mongoShell。
使用访问控制重新启动 MongoDB 实例。
使用--auth
命令行选项或security.authorization设置(如果使用配置文件)重新启动mongod实例。
mongod --auth --port 27017 --dbpath /data/db1
现在,连接到该实例的 Client 端必须将自己认证为 MongoDB 用户。Client 只能执行由其分配的角色确定的操作。
以用户 Management 员身份连接并进行身份验证。
使用mongo shell,您可以:
-
通过传递用户凭据连接到身份验证,或
-
首先连接而不进行身份验证,然后发出db.auth()方法进行身份验证。
在连接期间进行身份验证
使用-u <username>
,-p <password>
和--authenticationDatabase <database>
命令行选项启动mongo shell:
mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
在连接后进行身份验证
mongo --port 27017
切换到身份验证数据库(在本例中为admin
),然后使用db.auth(<username>, <pwd>)方法进行身份验证:
use admin
db.auth("myUserAdmin", "abc123" )
根据您的部署需要创建其他用户。
通过用户 Management 员身份验证后,请使用db.createUser()创建其他用户。您可以将built-in roles或user-defined roles分配给用户。
以下操作将用户myTester
添加到test
数据库,该用户在test
数据库中具有readWrite角色,在reporting
数据库中具有read角色。
Note
创建用户的数据库(在本示例中为test
)是该用户的authentication database。尽管用户将对此数据库进行身份验证,但是该用户可以在其他数据库中扮演角色;即用户的身份验证数据库不限制用户的特权。
use test
db.createUser(
{
user: "myTester",
pwd: "xyz123",
roles: [ { role: "readWrite", db: "test" },
{ role: "read", db: "reporting" } ]
}
)
创建其他用户后,断开mongo shell 的连接。
连接到实例并以 myTester 身份验证。
将mongoShell 断开为myUserAdmin
后,重新连接为myTester
。您可以:
-
通过传递用户凭据连接到身份验证,或
-
首先连接而不进行身份验证,然后发出db.auth()方法进行身份验证。
在连接期间进行身份验证
使用-u <username>
,-p <password>
和--authenticationDatabase <database>
命令行选项启动mongo shell:
mongo --port 27017 -u "myTester" -p "xyz123" --authenticationDatabase "test"
在连接后进行身份验证
mongo --port 27017
切换到身份验证数据库(在本例中为test
),然后使用db.auth(<username>, <pwd>)方法进行身份验证:
use test
db.auth("myTester", "xyz123" )
作为 myTester 插入到集合中。
作为myTester
,您有权在test
数据库中执行读取和写入操作(以及在reporting
数据库中执行读取操作)。例如,您可以在test
数据库中执行以下插入操作:
db.foo.insert( { x: 1, y: 1 } )
See also