要在MongoDB中对客户端进行身份验证,必须将相应的用户添加到MongoDB中。
要添加用户,MongoDB提供了该db.createUser()
方法。添加用户时,您可以为用户分配角色以授予特权。
注意
在数据库中创建的第一个用户应该是具有管理其他用户权限的用户管理员。请参阅 启用访问控制。
您还可以更新现有用户,例如更改密码以及授予或撤消角色。有关用户管理方法的完整列表,请参阅《 用户管理》。
用户由用户名和关联的身份验证数据库唯一标识。从MongoDB 4.0.9开始,为MongoDB管理的用户分配了一个unique userId
。[1]
也可以看看
添加用户时,可以在特定数据库中创建该用户。该数据库是用户的身份验证数据库。
用户可以在不同的数据库中拥有特权;也就是说,用户的权限不限于其身份验证数据库。通过分配其他数据库中的用户角色,在一个数据库中创建的用户可以有权对其他数据库进行操作。有关角色的更多信息,请参见基于角色的访问控制。
用户名和身份验证数据库用作该用户的唯一标识符。[1]也就是说,如果两个用户具有相同的名称,但在不同的数据库中创建,则它们是两个单独的用户。如果打算让一个用户在多个数据库上具有权限,请在适用的数据库中创建一个具有角色的单个用户,而不是在不同的数据库中多次创建该用户。
[1] | (1,2) 从4.0.9版开始,MongoDB 在LDAP服务器上创建的 LDAP受管用户在 system.users集合中没有关联的文档,因此没有 |
要以用户身份进行身份验证,必须提供用户名,密码和 与该用户关联的身份验证数据库。
要使用mongo
外壳进行身份验证,请执行以下任一操作:
连接到或
实例时,请使用mongo
命令行身份验证选项(--username
,
--password
和
--authenticationDatabase
),或者mongod
mongos
首先连接到mongod
或mongos
实例,然后对认证数据库运行authenticate
命令或
db.auth()
方法。
重要
以不同的用户身份进行多次身份验证不会删除先前已身份验证的用户的凭据。这可能导致连接具有比用户期望的更多的权限,并导致逻辑会话内的操作 引发错误。
有关使用MongoDB驱动程序进行身份验证的示例,请参阅 驱动程序文档。
对于MongoDB中创建的用户,MongoDB中存储所有用户的信息,包括name
,password
和在system.users集合中的
数据库。user's authentication
database
admin
不要直接访问此集合,而要使用用户管理命令。
要为分片群集创建用户,请连接到
mongos
实例并添加用户。然后,客户端通过mongos
实例对这些用户进行身份验证。在分片群集中,MongoDB将用户配置数据存储admin
在配置服务器的
数据库中。
然而,一些维护操作,如cleanupOrphaned
,
compact
,rs.reconfig()
,需要分片集群特定的碎片直接连接。要执行这些操作,您必须直接连接到分片并以分片本地
管理用户身份进行身份验证。
要创建分片本地管理用户,请直接连接到分片并创建该用户。MongoDB将分片本地用户存储在分片admin
本身的数据库中。
这些分片本地用户与通过添加到分片集群的用户完全独立mongos
。分片本地用户是分片本地用户,无法通过进行访问mongos
。
与分片的直接连接仅应用于分片特定的维护和配置。通常,客户端应通过来连接到分片群集mongos
。
本地主机异常允许您启用访问控制,然后在系统中创建第一个用户。除了localhost异常,在启用访问控制后,连接到localhost接口并在admin
数据库中创建第一个用户。第一个用户必须具有创建其他用户的特权,例如具有userAdmin
或userAdminAnyDatabase
角色的用户
。使用localhost异常的连接只能访问在admin
数据库上创建第一个用户。
在版本3.4中进行了更改: MongoDB 3.4扩展了localhost异常,以允许执行该
db.createRole()
方法。此方法允许用户通过LDAP授权在MongoDB内部创建一个角色,该角色映射到LDAP中定义的角色。有关更多信息,请参见LDAP授权。
只有在MongoDB实例中没有创建用户时,localhost例外才适用。
对于分片群集,本地主机例外适用于每个分片,也适用于整个群集。创建分片群集并通过mongos
实例添加用户管理员后,您仍必须防止未经授权而访问各个分片。对集群中的每个分片执行以下步骤之一:
enableLocalhostAuthBypass
参数设置为0
。