面试题答案
一键面试- 用户和角色基础概念:
- 用户:在MongoDB中,用户是权限管理的主体,通过用户名、密码和所属数据库进行标识。
- 角色:角色是一组权限的集合,MongoDB提供了一些内置角色,如
read
、readWrite
、dbAdmin
等,也可以自定义角色。
- 内置角色用于增删改查操作:
- 读操作(查):
- 若希望用户只能进行读取操作,可以给用户赋予
read
角色。例如,在admin
数据库下创建一个具有read
角色的用户:
- 若希望用户只能进行读取操作,可以给用户赋予
- 读操作(查):
use admin
db.createUser(
{
user: "readOnlyUser",
pwd: "password",
roles: [ { role: "read", db: "targetDB" } ]
}
)
- 该用户`readOnlyUser`只能读取`targetDB`数据库中的数据。
- 读写操作(增、改、查):
- 赋予
readWrite
角色可进行增、改、查操作。以在admin
数据库下创建具有readWrite
角色的用户为例:
- 赋予
use admin
db.createUser(
{
user: "readWriteUser",
pwd: "password",
roles: [ { role: "readWrite", db: "targetDB" } ]
}
)
- `readWriteUser`用户可以对`targetDB`数据库中的集合进行插入(增)、更新(改)和查询(查)操作。
3. 自定义角色实现更细粒度控制:
- 限制特定集合的操作:
- 假设要创建一个用户,只能对
targetDB
数据库中的specificCollection
集合进行插入和查询操作。首先自定义一个角色:
- 假设要创建一个用户,只能对
use targetDB
db.createRole(
{
role: "customInsertReadRole",
privileges: [
{
resource: { db: "targetDB", collection: "specificCollection" },
actions: [ "insert", "find" ]
}
],
roles: []
}
)
- 然后创建用户并赋予该自定义角色:
use admin
db.createUser(
{
user: "customUser",
pwd: "password",
roles: [ { role: "customInsertReadRole", db: "targetDB" } ]
}
)
- 复杂权限组合:
- 若要对多个集合进行不同的增删改查操作,可以在自定义角色的
privileges
数组中添加多个资源和操作的组合。例如,对collection1
可以插入和更新,对collection2
只能查询:
- 若要对多个集合进行不同的增删改查操作,可以在自定义角色的
use targetDB
db.createRole(
{
role: "complexCustomRole",
privileges: [
{
resource: { db: "targetDB", collection: "collection1" },
actions: [ "insert", "update" ]
},
{
resource: { db: "targetDB", collection: "collection2" },
actions: [ "find" ]
}
],
roles: []
}
)
- 再创建用户并赋予此角色:
use admin
db.createUser(
{
user: "complexUser",
pwd: "password",
roles: [ { role: "complexCustomRole", db: "targetDB" } ]
}
)
- 验证权限:
- 用户连接到MongoDB后,其权限会在执行操作时进行验证。例如,上述
readOnlyUser
尝试插入数据时会收到权限不足的错误,而具有相应权限的用户则可以成功执行操作。
- 用户连接到MongoDB后,其权限会在执行操作时进行验证。例如,上述
通过上述基于角色和权限设置的方式,可以有效限制特定用户只能对某些集合进行特定的增删改查操作,确保数据的安全性。