本教程提供了MongoDB授权模式下的用户和角色管理示例。学习如何向MongoDB添加新用户。
创建用户定义的角色
角色授权用户访问MongoDB资源。 MongoDB提供了许多内置的角色,管理员可以使用它们来控制对MongoDB系统的访问。 但是,如果这些角色无法描述所需的权限集,则可以在特定数据库中创建新角色。
除了在管理数据库中创建的角色外,角色只能包含适用于其数据库的权限,并且只能继承其数据库中的其他角色。
在管理数据库中创建的角色可以包括适用于管理数据库,其他数据库或群集资源的权限,并且可以从其他数据库中的角色以及管理数据库继承。
要创建新角色,可使用db.createRole()
方法,指定permissions
数组中的权限和roles
数组中的继承角色。
MongoDB使用数据库名称和角色名称的组合来唯一定义角色。 每个角色的范围限定在创建角色的数据库中,但MongoDB将所有角色信息存储在admin
数据库的admin.system.roles
集合中。
先决条件
要在数据库中创建角色,您必须具有:
- 对该数据库资源的
createRole
操作。 - 对该数据库的
grantRole
操作指定新角色的权限以及指定要继承的角色。
内置角色 userAdmin
和 userAdminAnyDatabase
在其各自的资源上提供 createRole
和 grantRole
操作。
创建角色来管理当前操作
以下示例创建一个名为 manageOpRole
的角色,该角色仅提供运行 db.currentOp()
和db.killOp()
的权限。
第一步:使用相应的权限连接到MongoDB
使用“先决条件”部分指定的权限连接到 mongod
或 mongos
。
以下过程使用在“启用认证”中创建的用户:myUserAdmin
。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
myUserAdmin
具有在管理员以及其他数据库中创建角色的权限。
第二步:创建一个新角色来管理当前操作
manageOpRole
具有对多个数据库以及群集资源的权限。 因此,您必须在管理数据库中创建该角色。
use admin
db.createRole(
{
role: "manageOpRole",
privileges: [
{ resource: { cluster: true }, actions: [ "killop", "inprog" ] },
{ resource: { db: "", collection: "" }, actions: [ "killCursors" ] }
],
roles: []
}
)
新角色授予杀死/终止任何操作的权限。
警告: 终止运行操作非常小心。只能使用
db.killOp()
方法或killOp
命令终止客户端发起的操作,并且不会终止内部数据库操作。
创建角色用来运行 mongostat
以下示例创建一个名为 mongostatRole
的角色,该角色仅提供运行 mongostat
的权限。
第一步:使用相应的权限连接到MongoDB
使用“先决条件”部分指定的权限连接到 mongod
或 mongos
。
以下过程使用在启用认证中创建的用户:myUserAdmin
。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
myUserAdmin
具有在管理员以及其他数据库中创建角色的权限。
第二步:创建一个新角色来管理当前的操作
mongostatRole
具有作用于群集资源的权限。 因此,您必须在管理数据库中创建该角色。
use admin
db.createRole(
{
role: "mongostatRole",
privileges: [
{ resource: { cluster: true }, actions: [ "serverStatus" ] }
],
roles: []
}
)
修改现有用户的访问权限
先决条件
- 必须对数据库具有
grantRole
操作才能在该数据库上授予角色。 - 必须在数据库上具有
revokeRole
操作以撤销该数据库上的角色。 - 要查看角色的信息,必须明确授予该角色,或必须对该角色的数据库具有
viewRole
操作。
执行步骤
第一步:使用相应的权限连接到MongoDB
以具有先决条件部分中指定的权限的用户身份连接到 mongod
或 mongos
。
以下过程使用在启用认证中创建的用户:myUserAdmin
。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
第二步:识别用户的角色和权限
要显示要修改的用户的角色和权限,请使用db.getUser()
和db.getRole()
方法。
例如,要查看在示例中创建的 reportsUser
的角色,执行以下命令:
use reporting
db.getUser("reportsUser")
要显示在 “accounts
” 数据库上由 readWrite
角色授予用户的权限,请执行以下操作:
use accounts
db.getRole( "readWrite", { showPrivileges: true } )
第三步:确定授予或撤销的权限
如果用户需要额外的权限,则向用户授予具有所需权限集的角色或角色。 如果此类角色不存在,请使用适当的权限集创建新角色。
撤销由现有角色提供的特权子集:撤销原始角色并授予仅包含所需权限的角色。如果角色不存在,您需要创建新角色。
第四步:修改用户的访问权限
4.1. 撤销角色
使用db.revokeRolesFromUser()
方法撤销角色。以下示例操作从account
数据库上删除用户reportsUser
的 readWrite
角色:
use reporting
db.revokeRolesFromUser(
"reportsUser",
[
{ role: "readWrite", db: "accounts" }
]
)
4.2. 授予角色
使用db.grantRolesToUser()
方法授予角色。 例如,以下操作授予reportsUser
用户account
数据库上的读取角色:
use reporting
db.grantRolesToUser(
"reportsUser",
[
{ role: "read", db: "accounts" }
]
)
对于分片集群,用户的更改将在命令运行的 mongos
上即时生效。但是,对于群集中的其他mongos 实例,用户缓存可能会等待10
分钟才能刷新。请参阅userCacheInvalidationIntervalSecs。
修改现有用户的密码
先决条件
要修改数据库上另一个用户的密码,您必须对该数据库具有changeAnyPassword
操作。
操作步骤:
第一步:使用相应的权限连接到MongoDB
以具有先决条件部分中指定的权限的用户身份连接到 mongod
或 mongos
。
以下过程使用在启用认证中创建的用户:myUserAdmin
。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
第二步:更改密码
将用户的用户名和新密码传递给db.changeUserPassword()
方法。
以下操作将reporting
用户的密码更改为:SOh3TbYhxuLiW8ypJPxmt1oOfL
:
db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")
查看用户的角色
先决条件
要查看其他用户的信息,您必须对其他用户的数据库具有viewUser
操作。
用户可以查看自己的信息。
第一步:使用相应的权限连接到MongoDB
以具有先决条件部分中指定的权限的用户身份连接到 mongod
或 mongos
。
以下过程使用在启用认证中创建的用户:myUserAdmin
。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
第二步:查看用户的角色
使用usersInfo
命令或db.getUser()
方法显示用户信息。
例如,要查看在示例中创建的 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" }
]
查看角色的权限
先决条件
要查看角色的信息,您必须明确授予该角色,或必须对该角色的数据库具有 viewRole
操作。
第一步:使用相应的权限连接到MongoDB
以具有先决条件部分中指定的权限的用户身份连接到 mongod
或 mongos
。
以下过程使用在启用认证中创建的用户:myUserAdmin
。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
第二步:查看角色授予的权限
对于给定的角色,请使用db.getRole()
方法或rolesInfo
命令与showPrivileges
选项一起执行:
例如,要查看在product
数据库上由读取角色授予的权限,请使用以下操作,问题如下:
use products
db.getRole( "read", { showPrivileges: true } )
在返回的文档中,有两个数组:privileges
和inheritedPrivileges
。权限列出了角色指定的权限,并排除了从其他角色继承的权限。 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" ]
}
]