Mongoose:使用一个用户的管理员权限在不同的 Mongo 数据库上进行身份验证

时间:2021-06-28 17:32:53

标签: mongodb mongoose ssh

我有一台运行 MongoDB 的服务器。我使用 admin 数据库和一个对所有数据库具有读写权限的用户 (readWriteAnyDatabase) 进行设置。此外,我在 mongod.conf (security: authorization: "enabled") 中启用了必要的授权。服务器也有ssh。

现在我正在尝试使用 mongoosetunnel-ssh 从我的笔记本电脑访问该数据库:

const mongoose = require("mongoose");
const fs = require("fs/promises");
const tunnel = require("tunnel-ssh");

const sshConfig = {
  username: "<USERNAME_ON_SERVER>",
  host: "<IP_ADDRESS>",
  agent: "pageant",
  privateKey: await fs.readFile("C:\\Users\\<USER_NAME>\\.ssh\\id_rsa"),
  port: 22,
  dstPort: 27017,
  passphrase: "<SSH-PASSPHRASE>"
};

let sshConnection;
try {
  sshConnection = await new Promise((resolve, reject) => tunnel(sshConfig, (error, server) => {
  if (error)
    reject(error);
  else
    resolve(server);
  }));
} catch (err) {
  console.log("SSH connection error:", err);
}

const mongoDB = mongoose.createConnection("mongo://adminName:adminPassword@localhost:27017/admin?retryWrites=true&w=majority", { 
  useUnifiedTopology: true, 
  useNewUrlParser: true ,
  useFindAndModify: false,
  useCreateIndex: true 
});

try {
  await new Promise(resolve => mongoDB.once("open", resolve));
} catch (err) {
  console.error("Error while connecting to mongoDB", err);
}

mongoDB.on("error", error => console.error("MongoDB-Error", error));

连接到第一个 admin 数据库工作正常。我可以用我的模型读写这个数据库。

我的问题是是否可以在 mongoose 中创建其他新数据库。

如果我尝试用新名称替换数据库的 URI 中的 /admin,我会收到验证错误。

我知道我可以事先在服务器上创建和授予对数据库的访问权限,但我更愿意为每个代码添加新数据库。

最后,我想到了禁用服务器授权的选项,这样我就可以在不需要用户的情况下访问所有数据库。因为我还有 ssh 加密,所以实际上需要用户密码验证吗?

1 个答案:

答案 0 :(得分:1)

如果用户是在 admin 数据库中创建的,但您想使用 URI 连接到不同的数据库,则需要在 URI 中指定 authSource 以便可以找到正确的用户帐户。

"mongo://adminName:adminPassword@localhost:27017/otherdb?authSource=admin&retryWrites=true&w=majority"