管理用户和角色
概述
本教程提供了 MongoDB 授权模型下的用户和角色管理示例。创建用户描述了如何将新用户添加到 MongoDB。
先决条件
重要的:
如果您已为部署启用访问控制,则必须以具有每个部分中指定的所需权限的用户身份进行身份验证。具有特定数据库中的
userAdminAnyDatabase
角色或角色的用户管理员 提供执行本教程中列出的操作所需的权限。有关将用户管理员添加为第一个用户的详细信息,userAdmin
请参阅 启用访问控制
创建用户定义的角色
角色授予用户访问 MongoDB 资源的权限。MongoDB 提供了许多内置角色,管理员可以使用这些角色来控制对 MongoDB 系统的访问。但是,如果这些角色无法描述所需的权限集,您可以在特定数据库中创建新角色。
除了在admin
数据库中创建的角色外,角色只能包含适用于其数据库的特权,并且只能从其数据库中的其他角色继承。
在数据库中创建的角色admin
可以包括适用于admin
数据库、其他数据库或 集群资源的特权,并且可以从其他数据库和admin
数据库中的角色继承。
要创建新角色,请使用db.createRole()
方法,指定数组中的权限privileges
和数组中的继承角色roles
。
MongoDB 使用数据库名称和角色名称的组合来唯一定义一个角色。每个角色都限定在您创建角色的数据库中,但 MongoDB 将所有角色信息存储在 数据库admin.system.roles
中的集合中admin
。
先决条件
要在数据库中创建角色,您必须具有:
内置角色userAdmin
和 对各自资源的userAdminAnyDatabase
提供createRole
和 操作。grantRole
要创建指定的角色authenticationRestrictions
,您必须对创建 该角色的数据库资源具有操作权限。setAuthenticationRestriction
创建一个角色来管理当前操作
以下示例创建一个名为的角色manageOpRole
,该角色仅提供运行 和 的db.currentOp()
权限 db.killOp()
。[ 1 ]
笔记:
从 MongoDB 3.2.9 开始,用户不需要任何特定权限即可查看或终止他们自己对
mongod
实例的操作。有关详细信息,请参阅db.currentOp()
和db.killOp()
。
使用适当的权限连接到 MongoDB。
连接到
mongod
或mongos
使用指定的权限先决条件部分。以下过程使用
myUserAdmin
在 启用访问控制中创建的。mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
有权在 以及其他数据库
myUserAdmin
中创建角色。admin
创建一个新角色来管理当前操作。
manageOpRole
具有作用于多个数据库以及集群资源的特权。因此,您必须在admin
数据库中创建角色。use admin db.createRole( { role: "manageOpRole", privileges: [ { resource: { cluster: true }, actions: [ "killop", "inprog" ] }, { resource: { db: "", collection: "" }, actions: [ "killCursors" ] } ], roles: [] } )
新角色授予终止任何操作的权限。
警告:
终止正在运行的操作时要格外小心。仅使用
db.killOp()
方法或killOp
命令终止客户端发起的操作,不要终止内部数据库操作。
内置角色clusterMonitor
还提供与其他权限一起运行的权限db.currentOp()
,内置角色提供与其他权限一起hostManager
运行的权限。db.killOp()
创建要运行的角色mongostat
以下示例创建一个名为的角色mongostatRole
,该角色仅提供运行权限mongostat
使用适当的权限连接到 MongoDB。
连接到
mongod
或mongos
使用指定的权限先决条件部分。以下过程使用
myUserAdmin
在 启用访问控制中创建的。mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
有权在 以及其他数据库
myUserAdmin
中创建角色。admin
创建一个新角色来管理当前操作。
mongostatRole
具有作用于集群资源的特权。因此,您必须在admin
数据库中创建角色。use admin db.createRole( { role: "mongostatRole", privileges: [ { resource: { cluster: true }, actions: [ "serverStatus" ] } ], roles: [] } )
内置角色
clusterMonitor
还提供运行权限mongostat
连同其他特权。
创建角色system.views
以跨数据库删除集合
以下示例创建一个名为的角色 dropSystemViewsAnyDatabase
,该角色提供在任何数据库中删除集合的权限 system.views
。
使用适当的权限连接到 MongoDB。
连接到
mongod
或mongos
使用指定的权限先决条件部分。以下过程使用
myUserAdmin
在 启用访问控制中创建的。mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
有权在 以及其他数据库
myUserAdmin
中创建角色。admin
创建一个新角色以将
system.views
集合删除到任何数据库中。对于角色,指定一个特权,包括:
- 一个
actions
包含dropCollection
动作的数组,以及 - 为数据库 指定空字符串 ( ) 并为集合指定字符串的资源文档。有关详细信息,请参阅 将跨数据库的集合指定为资源。
""``"system.views"
use admin db.createRole( { role: "dropSystemViewsAnyDatabase", privileges: [ { actions: [ "dropCollection" ], resource: { db: "", collection: "system.views" } } ], roles: [] } )
- 一个
修改现有用户的访问权限
先决条件
- 您必须对数据库执行操作才能授予对该数据库的角色。
grantRole
- 您必须对数据库执行操作才能撤销对该数据库的角色。
revokeRole
- 要查看角色的信息,您必须被明确授予该角色,或者必须对该角色的数据库执行操作。
viewRole
程序
使用适当的权限连接到 MongoDB。
连接到
mongod
或mongos
作为具有先决条件部分中指定权限的用户。以下过程使用
myUserAdmin
在 启用访问控制中创建的。mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
确定用户的角色和权限。
要显示要修改的用户的角色和权限,请使用
db.getUser()
和db.getRole()
方法。例如,要查看
reportsUser
在 附加示例中创建的角色,请发出:use reporting db.getUser("reportsUser")
要显示角色授予用户的数据库权限
readWrite
,"accounts"
请发出:use accounts db.getRole( "readWrite", { showPrivileges: true } )
确定授予或撤销的权限。
如果用户需要额外的权限,则向用户授予一个或多个具有所需权限集的角色。如果不存在这样的角色,创建一个新角色 具有适当的权限集。
要撤销现有角色提供的部分特权:撤销原始角色并授予仅包含所需特权的角色。你可能需要创建一个新角色如果角色不存在。
修改用户的访问权限。
撤销角色
使用方法撤销角色
db.revokeRolesFromUser()
。以下示例操作从数据库readWrite
中删除角色:accounts``reportsUser
use reporting db.revokeRolesFromUser( "reportsUser", [ { role: "readWrite", db: "accounts" } ] )
授予角色
使用方法授予角色
db.grantRolesToUser()
。例如,以下操作授予reportsUser
用户read
对accounts
数据库的角色:use reporting db.grantRolesToUser( "reportsUser", [ { role: "read", db: "accounts" } ] )
对于分片集群,对用户的更改在
mongos
命令运行时即时发生。但是,对于mongos
集群中的其他实例,用户缓存最多可能需要等待 10 分钟才能刷新。看userCacheInvalidationIntervalSecs
。
修改现有用户的密码
先决条件
要修改数据库上另一个用户的密码,您必须 对该数据库执行操作。changePassword
程序
使用适当的权限连接到 MongoDB。
连接到
mongod
或mongos
使用指定的权限先决条件部分。以下过程使用
myUserAdmin
在 启用访问控制中创建的。mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
更改密码
将用户的用户名和新密码传递给该
db.changeUserPassword()
方法。以下操作将
reporting
用户的密码更改为SOh3TbYhxuLiW8ypJPxmt1oOfL
:db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")
提示:
也可以看看:
查看用户的角色
先决条件
要查看其他用户的信息,您必须对其他用户的数据库执行 viewUser 操作
用户可以查看自己的信息。
程序
使用适当的权限连接到 MongoDB。
连接到
mongod
或mongos
作为具有先决条件部分中指定权限的用户。以下过程使用
myUserAdmin
在 启用访问控制中创建的。mongosh --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
在 启用访问控制中创建的。mongosh --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" ] } ]
译者:韩鹏帅