以下示例介绍了在 MongoDB 授权模型下进行自管理部署的用户和角色管理。要创建用户,请参阅在自管理部署上创建用户。
先决条件
如果已为部署启用访问权限控制,则必须以具有每节中指定的所需权限的用户身份进行身份验证。 要执行本教程中列出的操作,用户管理员需要具有特定数据库中的userAdminAnyDatabase角色或userAdmin角色。 有关添加用户管理员作为第一个用户的详细信息,请参阅对自托管部署启用访问控制
创建用户定义的角色
注意
要在MongoDB Atlas中创建用户定义的角色,请参阅MongoDB Atlas文档中的添加自定义角色。
MongoDB 为常见访问模式提供内置角色。如果内置角色不覆盖所需权限,请创建用户定义角色。
除在 admin 数据库中创建的角色之外,角色只能包含会应用于其数据库的特权,且只能从其数据库中的其他角色来继承。
在 admin 数据库中创建的角色可包含会应用于 admin 数据库、其他数据库或集群资源的特权,且可从其他数据库和 admin 数据库中的角色来继承。
要创建新角色,请使用 db.createRole() 方法,在 privileges 数组中指定权限,在 roles 数组中指定继承的角色。
MongoDB 使用数据库名称和角色名称的组合来唯一定义角色。每个角色的范围都限于您创建该角色的数据库,但 MongoDB 将所有角色信息存储在 admin 数据库的 admin.system.roles 集合中。
先决条件
要在数据库中创建角色,必须:
对该数据库资源执行
createRole操作。
通过内置角色 userAdmin 和 userAdminAnyDatabase,可在各自的资源上执行 createRole 和 grantRole 操作。
要在指定 authenticationRestrictions 时创建角色,必须针对创建该角色的数据库资源执行 setAuthenticationRestriction 操作。
To add custom user-defined roles with mongosh, see the following examples:
创建用于管理当前操作的角色
以下示例创建了一个名为 manageOpRole 的角色,该角色仅提供运行 db.currentOp() 和 db.killOp() 的权限。[1]
注意
用户不需要任何特定权限即可查看或终止自己在 mongod 实例上的操作。有关详细信息,请参阅 db.currentOp() 和 db.killOp()。
以具有相应特权的用户身份连接到 MongoDB。
Connect to mongod or mongos with the privileges specified in the Prerequisites section.
以下过程使用对自管理部署启用访问控制中创建的 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 命令来终止客户端发起的操作,而不会终止数据库内部操作。
| [1] | 内置角色 clusterMonitor 还提供运行 db.currentOp() 的权限以及其他权限,内置角色 hostManager 提供运行 db.killOp() 的权限以及其他权限。 |
创建一个角色来运行 mongostat
以下示例创建了一个名为mongostatRole mongostat的角色,该角色仅提供运行 的特权。 []2
以具有相应特权的用户身份连接到 MongoDB。
Connect to mongod or mongos with the privileges specified in the Prerequisites section.
以下过程使用对自管理部署启用访问控制中创建的 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: [] } )
| [2] | The built-in role clusterMonitor also provides the privilege to run mongostat along with other privileges. |
创建角色以跨数据库删除 system.views 集合
以下示例会创建一个名为 dropSystemViewsAnyDatabase 的角色,该角色提供在任何数据库中删除 system.views 集合的权限。
以具有相应特权的用户身份连接到 MongoDB。
Connect to mongod or mongos with the privileges specified in the Prerequisites section.
以下过程使用对自管理部署启用访问控制中创建的 myUserAdmin。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
myUserAdmin 拥有在 admin 和其他数据库中创建角色的权限。
创建一个新角色以在任意数据库中删除 system.views 集合。
为角色指定一项权限,其中包括:
包含
dropCollection操作的actions数组,以及一个资源文档,其中为数据库指定一个空字符串 (
""),并为集合指定字符串"system.views"。有关更多信息,请参见将跨数据库的集合指定为资源。
use admin db.createRole( { role: "dropSystemViewsAnyDatabase", privileges: [ { actions: [ "dropCollection" ], resource: { db: "", collection: "system.views" } } ], roles: [] } )
修改现有用户的访问权限
注意
To modify an existing database user's roles in MongoDB Atlas, see Manage Database Users in the MongoDB Atlas documentation.
先决条件
必须对数据库执行
revokeRole动作才能撤消该数据库上的角色。
步骤
以具有相应特权的用户身份连接到 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()方法撤销角色。以下示例操作从 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 个实例,用户缓存可能需要等待 10 分钟才能刷新。请参阅 userCacheInvalidationIntervalSecs。
修改现有用户的密码
注意
To modify an existing MongoDB Atlas user's password, see Manage Database Users in the MongoDB Atlas documentation.
先决条件
要修改数据库其他用户的密码,必须对该数据库执行 changePassword 操作。
步骤
以具有相应特权的用户身份连接到 MongoDB。
Connect to the mongod or mongos with the privileges specified in the Prerequisites section.
以下过程使用对自管理部署启用访问控制中创建的 myUserAdmin。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
更改密码。
将用户的用户名和新密码传递给 db.changeUserPassword() 方法。
以下操作将 reporting 用户的密码更改为 SOh3TbYhxuLiW8ypJPxmt1oOfL:
db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")
查看用户角色
注意
To view a user's roles in MongoDB Atlas, see Manage Database Users in the MongoDB Atlas documentation.
先决条件
要查看其他用户的信息,必须对其他用户的数据库执行 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" } ]
查看角色特权
注意
要查看 MongoDB Atlas 中角色的权限,请参阅 MongoDB Atlas 文档中的查看自定义角色。
先决条件
步骤
以具有相应特权的用户身份连接到 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" ] } ]