Enable Auth

在本页面

Overview

在 MongoDB 部署上启用访问控制会强制执行身份验证,要求用户标识自己。访问启用了访问控制的 MongoDB 部署时,用户只能执行由其角色确定的操作。

对于身份验证,MongoDB 支持各种Authentication Mechanisms

以下教程在独立的mongod实例上启用访问控制,并使用默认身份验证机制

副本集和分片群集

启用访问控制后,副本集和分片群集需要成员之间的内部身份验证。有关更多详细信息,请参阅Internal Authentication

User Administrator

启用访问控制后,请确保您在admin数据库中拥有一个具有userAdminuserAdminAnyDatabase角色的用户。该用户可以 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"

在连接后进行身份验证

mongoShell 连接到mongod

mongo --port 27017

切换到身份验证数据库(在本例中为admin),然后使用db.auth(<username>, <pwd>)方法进行身份验证:

use admin
db.auth("myUserAdmin", "abc123" )

根据您的部署需要创建其他用户。

通过用户 Management 员身份验证后,请使用db.createUser()创建其他用户。您可以将built-in rolesuser-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"

在连接后进行身份验证

mongoShell 连接到mongod

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 } )