On this page
Management 用户和角色
在本页面
Overview
本教程提供了 MongoDB 授权模型下的用户和角色 Management 示例。 Add Users介绍了如何向 MongoDB 添加新用户。
Prerequisites
Important
如果您有启用访问控制进行部署,则必须使用每个部分中指定的必需特权以用户身份进行身份验证。在特定数据库中具有userAdminAnyDatabase角色或userAdmin角色的用户 Management 员提供执行本教程中列出的操作所需的特权。有关将用户 Management 员添加为第一个用户的详细信息,请参见Enable Auth。
创建用户定义的角色
角色授予用户访问 MongoDB 资源的权限。 MongoDB 提供了许多built-in roles,Management 员可以使用它们来控制对 MongoDB 系统的访问。但是,如果这些角色无法描述所需的特权集,则可以在特定数据库中创建新角色。
除在admin
数据库中创建的角色外,角色只能包含适用于其数据库的特权,并且只能从其数据库中的其他角色继承。
在admin
数据库中创建的角色可以包括应用于admin
数据库,其他数据库或cluster资源的特权,并且可以从其他数据库以及admin
数据库中的角色继承。
若要创建新角色,请使用db.createRole()方法,在privileges
数组中指定特权,并在roles
数组中指定继承的角色。
MongoDB 使用数据库名称和角色名称的组合来唯一定义角色。每个角色的作用域仅限于您在其中创建角色的数据库,但是 MongoDB 将所有角色信息存储在admin
数据库的admin.system.roles集合中。
Prerequisites
要在数据库中创建角色,您必须具有:
内置角色userAdmin和userAdminAnyDatabase在其各自的resources上提供createRole和grantRole动作。
要创建指定了authenticationRestrictions
的角色,必须在创建该角色的database resource上具有setAuthenticationRestriction action。
创建一个角色来 Management 当前操作
以下示例创建一个名为manageOpRole
的角色,该角色仅提供同时运行db.currentOp()和db.killOp()的特权。 [1]
Note
在版本 3.2.9 中进行了更改:在mongod实例上,用户不需要任何特定特权即可查看或取消自己的操作。有关详情,请参见db.currentOp()和db.killOp()。
以适当的权限连接到 MongoDB。
使用Prerequisites部分中指定的权限连接到mongod或mongos。
以下过程使用在Enable Auth中创建的myUserAdmin
。
mongo --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
myUserAdmin
有权在admin
以及其他数据库中创建角色。
创建一个新角色来 Management 当前操作。
manageOpRole
和cluster resource一样,都具有对多个数据库起作用的特权。因此,您必须在admin
数据库中创建角色。
use admin
db.createRole(
{
role: "manageOpRole",
privileges: [
{ resource: { cluster: true }, actions: [ "killop", "inprog" ] },
{ resource: { db: "", collection: "" }, actions: [ "killCursors" ] }
],
roles: []
}
)
新角色授予杀死任何操作的权限。
Warning
极其谨慎地终止正在运行的操作。仅使用db.killOp()方法或killOp命令来终止由 Client 端启动的操作,并且请勿终止内部数据库操作。
[1] | 内置角色clusterMonitor还提供了与其他特权一起运行db.currentOp()的特权,内置角色hostManager提供了与其他特权一起运行db.killOp()的特权。 |
创建要运行 mongostat 的角色
以下示例创建一个名为mongostatRole
的角色,该角色仅提供运行mongostat的特权。 [2]
以适当的权限连接到 MongoDB。
使用Prerequisites部分中指定的权限连接到mongod或mongos。
以下过程使用在Enable Auth中创建的myUserAdmin
。
mongo --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
myUserAdmin
有权在admin
以及其他数据库中创建角色。
创建一个新角色来 Management 当前操作。
mongostatRole
具有对cluster resource起作用的特权。因此,您必须在admin
数据库中创建角色。
use admin
db.createRole(
{
role: "mongostatRole",
privileges: [
{ resource: { cluster: true }, actions: [ "serverStatus" ] }
],
roles: []
}
)
[2] | 内置角色clusterMonitor还提供了运行mongostat的特权以及其他特权。 |
创建一个角色以删除跨数据库的 system.views 集合
下面的示例创建一个名为dropSystemViewsAnyDatabase
的角色,该角色提供将system.views
集合删除到任何数据库中的特权。
以适当的权限连接到 MongoDB。
使用Prerequisites部分中指定的权限连接到mongod或mongos。
以下过程使用在Enable Auth中创建的myUserAdmin
。
mongo --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
myUserAdmin
有权在admin
以及其他数据库中创建角色。
创建一个新角色,以将 system.views 集合拖放到任何数据库中。
对于角色,请指定一个包含以下内容的privilege:
包含dropCollection操作的
actions
数组,以及resource document,它为数据库指定一个空字符串(
""
),为集合指定一个字符串"system.views"
。有关更多信息,请参见将跨数据库的集合指定为资源。
use admin
db.createRole(
{
role: "dropSystemViewsAnyDatabase",
privileges: [
{
actions: [ "dropCollection" ],
resource: { db: "", collection: "system.views" }
}
],
roles: []
}
)
修改现有用户的访问权限
Prerequisites
您必须在数据库上拥有revokeRole action才能撤消该数据库上的角色。
Procedure
以适当的权限连接到 MongoDB。
使用先决条件部分中指定的特权,以用户身份连接到mongod或mongos。
以下过程使用在Enable Auth中创建的myUserAdmin
。
mongo --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
标识用户的角色和特权。
要显示要修改的用户的角色和特权,请使用db.getUser()和db.getRole()方法。
例如,要查看在Examples中创建的reportsUser
的角色,请发出:
use reporting
db.getUser("reportsUser")
要显示"accounts"
数据库上readWrite
角色授予用户的特权,请发出:
use accounts
db.getRole( "readWrite", { showPrivileges: true } )
标识授予或撤消的特权。
如果用户需要其他特权,请向用户授予一个或多个角色,并带有所需的特权集。如果不存在这样的角色,则创建一个新角色具有适当的特权集。
要撤消现有角色提供的特权的子集,请执行以下操作:撤消原始角色,并授予仅包含所需特权的角色。如果角色不存在,则可能需要创建一个新角色。
修改用户的访问权限。
撤销角色
使用db.revokeRolesFromUser()方法撤消角色。以下示例操作从reportsUser
删除accounts
数据库上的readWrite角色:
use reporting
db.revokeRolesFromUser(
"reportsUser",
[
{ role: "readWrite", db: "accounts" }
]
)
授予角色
使用db.grantRolesToUser()方法授予角色。例如,以下操作向reportsUser
用户授予accounts
数据库上的read角色:
use reporting
db.grantRolesToUser(
"reportsUser",
[
{ role: "read", db: "accounts" }
]
)
对于分片群集,在运行命令的mongos上即时更改用户。但是,对于群集中的其他mongos实例,用户缓存可能要 await10 分钟才能刷新。参见userCacheInvalidationIntervalSecs。
修改现有用户的密码
Prerequisites
要修改数据库中另一个用户的密码,您必须在该数据库上具有changeAnyPassword
action。
Procedure
以适当的权限连接到 MongoDB。
使用Prerequisites部分中指定的权限连接到mongod或mongos。
以下过程使用在Enable Auth中创建的myUserAdmin
。
mongo --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
更改密码。
将用户的用户名和新密码传递给db.changeUserPassword()方法。
以下操作将reporting
用户的密码更改为SOh3TbYhxuLiW8ypJPxmt1oOfL
:
db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")
See also
查看用户的角色
Prerequisites
要查看另一个用户的信息,您必须在另一个用户的数据库上拥有viewUser action。
用户可以查看自己的信息。
Procedure
以适当的权限连接到 MongoDB。
使用先决条件部分中指定的特权,以用户身份连接到mongod或mongos。
以下过程使用在Enable Auth中创建的myUserAdmin
。
mongo --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
标识用户的角色。
使用usersInfo命令或db.getUser()方法显示用户信息。
例如,要查看在Examples中创建的reportsUser
的角色,请发出:
use reporting
db.getUser("reportsUser")
在返回的文档中,roles字段显示reportsUser
的所有角色:
...
"roles" : [
{ "role" : "readWrite", "db" : "accounts" },
{ "role" : "read", "db" : "reporting" },
{ "role" : "read", "db" : "products" },
{ "role" : "read", "db" : "sales" }
]
查看角色的特权
Prerequisites
要查看角色的信息,必须为您明确授予该角色或在角色的数据库上具有viewRole action。
Procedure
以适当的权限连接到 MongoDB。
使用先决条件部分中指定的特权,以用户身份连接到mongod或mongos。
以下过程使用在Enable Auth中创建的myUserAdmin
。
mongo --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
标识角色授予的特权。
对于给定的角色,将db.getRole()方法或rolesInfo命令与showPrivileges
选项一起使用:
例如,要查看read
角色在products
数据库上授予的特权,请使用以下操作,发出:
use products
db.getRole( "read", { showPrivileges: true } )
在返回的文档中,privileges和inheritedPrivileges数组。 privileges列出了角色直接指定的特权,并排除了从其他角色继承的那些特权。 inheritedPrivileges列出了此角色授予的所有特权,包括直接指定和继承的特权。如果角色不继承其他角色,则两个字段相同。
...
"privileges" : [
{
"resource": { "db" : "products", "collection" : "" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
},
{
"resource" : { "db" : "products", "collection" : "system.js" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
}
],
"inheritedPrivileges" : [
{
"resource": { "db" : "products", "collection" : "" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
},
{
"resource" : { "db" : "products", "collection" : "system.js" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
}
]