Mongoose:使用一个用户的管理员权限在不同的 Mongo 数据库上进行身份验证
Mongoose: authenticate onto different Mongo-databases with admin-priviliges of one user
我有一个服务器运行 MongoDB。我设置了一个 admin
数据库和一个对所有数据库都有读写权限的用户 (readWriteAnyDatabase)。此外,我在 mongod.conf
(security: authorization: "enabled"
) 中启用了必需的授权。服务器也有ssh.
现在我正尝试使用 mongoose
和 tunnel-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 加密,所以用户密码身份验证真的是必要的吗?
如果用户是在 admin 数据库中创建的,但您想使用 URI 连接到其他数据库,则需要在 URI 中指定 authSource 以便找到正确的用户帐户。
"mongo://adminName:adminPassword@localhost:27017/otherdb?authSource=admin&retryWrites=true&w=majority"
我有一个服务器运行 MongoDB。我设置了一个 admin
数据库和一个对所有数据库都有读写权限的用户 (readWriteAnyDatabase)。此外,我在 mongod.conf
(security: authorization: "enabled"
) 中启用了必需的授权。服务器也有ssh.
现在我正尝试使用 mongoose
和 tunnel-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 加密,所以用户密码身份验证真的是必要的吗?
如果用户是在 admin 数据库中创建的,但您想使用 URI 连接到其他数据库,则需要在 URI 中指定 authSource 以便找到正确的用户帐户。
"mongo://adminName:adminPassword@localhost:27017/otherdb?authSource=admin&retryWrites=true&w=majority"