Nodejs mongodb权限验证问题

Nodejs mongodb权限验证问题

新安装的mongodb,我要用远程连接,所以我在admin数据库里增加了一个用户,但是用这个用户远程连接非admin数据库提示没有权限,网上查了下资料后发现我的操作步骤都没有问题,但是我的mongodb的admin数据库增加用户后用 db.system.users.find() 的结果:

{
    "_id" : "admin.root",
    "user" : "root",
    "db" : "admin",
    "credentials" : {
        "MONGODB-CR" : "3b91e37c8ea4477ba2e47a9c3f6b2536"
    },
    "roles" : [ 
        {
            "role" : "root",
            "db" : "admin"
        }
    ]
}

而网上的是这样的

{ "_id" : ObjectId("4e02a89fb841deb5fda3e5e2"), "user" : "root", "readOnly" : false, "pwd" : "59cf7cc156874cbd35cb00869126f569" }

是mongodb版本的问题吗?


4 回复

Node.js MongoDB 权限验证问题

问题描述

最近我新安装了 MongoDB,并且希望通过远程连接到它。为了实现这一点,我在 admin 数据库中创建了一个用户,但当我尝试使用该用户远程连接到非 admin 数据库时,却收到了权限不足的错误。经过查阅资料,我发现自己的操作步骤并无问题,但与网上的示例结果有所不同。

示例查询结果

admin 数据库中,通过以下命令查询用户信息:

db.system.users.find().pretty()

得到的结果如下:

{
    "_id" : "admin.root",
    "user" : "root",
    "db" : "admin",
    "credentials" : {
        "MONGODB-CR" : "3b91e37c8ea4477ba2e47a9c3f6b2536"
    },
    "roles" : [ 
        {
            "role" : "root",
            "db" : "admin"
        }
    ]
}

而网上常见的示例如下:

{ 
    "_id" : ObjectId("4e02a89fb841deb5fda3e5e2"), 
    "user" : "root", 
    "readOnly" : false, 
    "pwd" : "59cf7cc156874cbd35cb00869126f569" 
}

分析与解决方法

  1. 检查 MongoDB 版本

    • 网上的示例可能来自旧版本的 MongoDB。现在的版本(如 4.x)中,用户认证和角色管理已经有所变化。
    • 使用的认证机制 (MONGODB-CR) 可能与之前的版本不同。
  2. 正确设置用户角色

    • 需要在非 admin 数据库中为用户分配适当的权限。例如,在 test 数据库中创建一个具有读写权限的用户:
    use test;
    db.createUser({
        user: "testUser",
        pwd: "testPassword",
        roles: [
            { role: "readWrite", db: "test" }
        ]
    });
    
  3. Node.js 连接配置

    • 在 Node.js 应用程序中,确保使用正确的用户名、密码以及数据库名称进行连接:
    const MongoClient = require('mongodb').MongoClient;
    
    const uri = "mongodb://testUser:testPassword[@localhost](/user/localhost):27017/test";
    MongoClient.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
        if (err) {
            console.error(err);
            return;
        }
        console.log("Connected to MongoDB");
        client.close();
    });
    

总结

如果你在使用最新版本的 MongoDB 时遇到权限问题,请确保正确地为用户分配角色,并使用最新的认证机制。上述示例展示了如何在非 admin 数据库中创建用户并授予适当的权限,以及如何在 Node.js 应用程序中进行连接。


我的mongodb版本是2.6.1

$ mongo
MongoDB shell version: 2.4.9
connecting to: test
use admin
switched to db admin            
db.addUser("admin","password")
{
    "user" : "admin",
    "readOnly" : false,
    "pwd" : "90f500568434c37b61c8c1ce05fdf3ae",
    "_id" : ObjectId("513af8cac115e7a6b4bcceb9")
}
addUser succeeded, but cannot wait for replication since we no longer have auth

然后要认证

db.auth("admin","password")

这是我之前做的, 一直没有问题, 不知道你是怎么增加用户的

根据你的描述,你已经在 admin 数据库中创建了一个用户,但当你尝试用该用户连接到其他数据库时遇到了权限问题。这可能是由于角色分配不当导致的。

解决方案

你需要为该用户分配正确的角色。例如,如果你想让用户能够读写某个特定数据库(如 test 数据库),你需要分配一个具有适当权限的角色。

以下是如何在 MongoDB 中创建具有适当权限的用户的示例:

  1. 打开 MongoDB Shell

    mongo --host <your-host> -u <username> -p <password> --authenticationDatabase admin
    
  2. 切换到目标数据库并创建用户: 假设你要为 test 数据库创建一个用户,并赋予其读写权限。

    use test;
    db.createUser({
        user: "testUser",
        pwd: "testPassword",
        roles: [
            { role: "readWrite", db: "test" }
        ]
    });
    

示例代码

假设你想创建一个名为 testUser 的用户,并赋予其 test 数据库的读写权限:

use admin;
db.createUser({
    user: "root",
    pwd: "yourpassword",
    roles: [
        { role: "userAdminAnyDatabase", db: "admin" },
        { role: "readWriteAnyDatabase", db: "admin" }
    ]
});

// 创建另一个用户用于特定数据库
use test;
db.createUser({
    user: "testUser",
    pwd: "testPassword",
    roles: [
        { role: "readWrite", db: "test" }
    ]
});

解释

  • userAdminAnyDatabasereadWriteAnyDatabase 角色:这些角色允许你在任何数据库上进行用户管理和读写操作。这通常用于管理员用户。
  • readWrite 角色:这个角色允许用户对指定数据库进行读写操作。

通过以上步骤,你应该能够解决你的权限验证问题。确保你在正确的数据库上创建用户并赋予正确的角色。

回到顶部