MST

星途 面试题库

面试题:MongoDB 中如何在事务中设置角色权限以确保安全性?

请描述在 MongoDB 事务场景下,设置角色权限的基本步骤和相关命令,假设我们有一个银行转账的事务操作,要确保只有特定角色的用户能执行该事务,应如何配置权限?
16.5万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试
  1. 创建角色并赋予权限
    • 登录到MongoDB的admin数据库,使用use admin命令。
    • 创建一个具有执行银行转账事务所需权限的角色。例如,如果转账操作涉及对bank数据库中accounts集合的读写操作,可以这样创建角色:
db.createRole(
   {
     role: "bankTransferRole",
     privileges: [
       {
         resource: { db: "bank", collection: "accounts" },
         actions: [ "find", "update" ]
       }
     ],
     roles: []
   }
)
  1. 创建用户并分配角色
    • 同样在admin数据库下,创建一个用户并分配上述创建的bankTransferRole角色:
db.createUser(
   {
     user: "bankTransferUser",
     pwd: "password123",
     roles: [ { role: "bankTransferRole", db: "admin" } ]
   }
)
  1. 在事务代码中使用该用户
    • 在应用程序连接MongoDB时,使用bankTransferUser这个用户进行连接,这样只有这个具有bankTransferRole角色的用户能执行银行转账事务操作。例如在Node.js中使用mongodb驱动连接时:
const { MongoClient } = require('mongodb');
const uri = "mongodb://bankTransferUser:password123@localhost:27017/?authSource=admin";
const client = new MongoClient(uri);
async function transferFunds() {
    try {
        await client.connect();
        const session = client.startSession();
        session.startTransaction();
        // 银行转账的具体操作代码,例如更新账户余额
        const sourceAccountCollection = client.db('bank').collection('accounts');
        const destinationAccountCollection = client.db('bank').collection('accounts');
        // 执行转账操作的更新语句
        await sourceAccountCollection.updateOne({ accountNumber: "12345" }, { $inc: { balance: -100 } }, { session });
        await destinationAccountCollection.updateOne({ accountNumber: "67890" }, { $inc: { balance: 100 } }, { session });
        await session.commitTransaction();
    } catch (e) {
        console.error(e);
        await session.abortTransaction();
    } finally {
        await client.close();
    }
}
transferFunds();

在上述步骤中,通过创建特定权限的角色,并将角色分配给用户,然后在事务代码中使用该用户连接,确保了只有特定角色的用户能执行银行转账事务。