如何使用 Node.js 和 mongoose 解决“命令查找需要身份验证”?

mlh*_*zan 12 mongoose mongodb node.js

我需要帮助来修复错误。我的 ubuntu 服务器 16.04 正在运行:

MongoDB shell 版本 v4.0.9

节点 11.6

猫鼬 5.3.4

当 /etc/mongod.conf 上的安全性是:

security: authorization: "disabled" 我可以用 :

const mongoURI = 'mongodb://writeApp:writeApp9779@127.0.0.1:27017/writeapp';
Run Code Online (Sandbox Code Playgroud)

const db = mongoose.connect(mongoURI, { useNewUrlParser: true });

所有数据库命令都有效。即使我通过输入错误的密码进行检查,它也显示身份验证失败。但是正如您所知,由于禁用了授权,mongodb 仍然可以工作。

db.getUsers() 从命令行检查我的用户数据是正确的:

> db.getUsers();
[
 {
    "_id" : "admin.root",
    "userId" : UUID("8f6c1295-a261-4057-9a29-8a9919437841"),
    "user" : "root",
    "db" : "admin",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
 },
 {
    "_id" : "admin.writeApp",
    "userId" : UUID("ee148506-1860-4739-80db-17352e0e2ccb"),
    "user" : "writeApp",
    "db" : "admin",
    "roles" : [
        {
            "role" : "dbOwner",
            "db" : "writeapp"
        },
        {
            "role" : "listDatabases",
            "db" : "admin"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

真正的问题: 所以我 nano /etc/mongod.conf 并在重新启动 mongo 后更改了授权:“启用”。当我重新运行我的应用程序时,出现以下错误:

{ MongoError: command find requires authentication
 ............
 ............
 ok: 0,
 errmsg: 'command find requires authentication',
code: 13,
codeName: 'Unauthorized',
name: 'MongoError',
[Symbol(mongoErrorContextSymbol)]: {} }
Run Code Online (Sandbox Code Playgroud)

花了很长时间后,我使用 mongo shell 连接:

mongo -u "writeApp" -p writeApp9779 --authenticationDatabase "admin"
> use writeapp;
  switched to db writeapp
> db.users.find();
  { "_id" : ObjectId("5cb63f23755c4469f8f6e2e6"),
  ..........
  }
Run Code Online (Sandbox Code Playgroud)

它在控制台中工作,但不在应用程序中。我找不到任何解决方案。真的需要你的体谅。顺便说一下,这里是一个示例 node.js

Category.find(function(err, categories){
if(err) console.log(err);
else {
    app.locals.categories = categories;
}
});
Run Code Online (Sandbox Code Playgroud)

模型:

var mongoose =require('mongoose');
var CategorySchema = mongoose.Schema({
title: {
    type:String,
    required:true
},
slug: {
    type:String
   }
});

module.exports = mongoose.model("Category", CategorySchema);
Run Code Online (Sandbox Code Playgroud)

amb*_*ing 13

查看db.geUsers()您帖子中的结果,目标数据库和身份验证数据库是不同的。authSource=admin您可以使用名为admin“您的身份验证凭据来源”的查询参数来更改连接 URL 。

连接网址:

const mongoURI =
  "mongodb://writeApp:writeApp9779@127.0.0.1:27017/writeapp?authSource=admin";
Run Code Online (Sandbox Code Playgroud)

或者

const mongoURI =
  "mongodb://writeApp:writeApp9779@localhost:27017/writeapp?authSource=admin";
Run Code Online (Sandbox Code Playgroud)

更新:关于用户角色

分配给用户的dbAdminwriteApp角色不提供对非系统集合的读/写。尝试将readreadWrite授予用户。

db.grantRolesToUser( "writeApp", [ "read" ] ) //OR
db.grantRolesToUser( "writeApp", [ "readWrite" ] )
Run Code Online (Sandbox Code Playgroud)

注意:authSource URI 选项文档


mlh*_*zan 7

1.如何从终端和mongo连接:

安装 MongoDB 时,授权被禁用。所以暂时保持这种状态。在 admin 数据库中创建一个 root 用户:

键入:mongod在一个终端中运行 db,然后在另一个终端中运行命令mongo来运行 access mongo 终端

use admin
db.createUser(
  {
    user: "root",
    pwd: "pass123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)
 
Run Code Online (Sandbox Code Playgroud)

现在创建一个数据库:

运行use语句。如果数据库不存在,它将被创建

使用 writeapp

要确认创建的数据库,必须插入一些数据,否则不会创建。 db.testcollection.insert({ artist: "Mike" })

之后,您已经创建了 root 用户和一个新的数据库。现在更改 mongodb 配置

nano /etc/mongod.conf 
Run Code Online (Sandbox Code Playgroud)

将该行更改为:

security:
   authorization: "enabled"
Run Code Online (Sandbox Code Playgroud)

现在从终端重新启动 db 服务。

sudo systemctl restart mongod

检查状态:

sudo systemctl status mongod

从现在起您需要密码才能登录 mongo

mongo -u root -p pass123 --authenticationDatabase admin

现在让我们在 admin 数据库中创建一个用户,但也为特定数据库(如 writeapp)授予管理员权限

`use admin`

`db.createUser({user:"writetApp", pwd:"writeApp5299", roles:[{role:"dbOwner", db:"writeapp"}]});`
Run Code Online (Sandbox Code Playgroud)

检查用户:

db.getUsers();
[
   {
    "_id" : "admin.root",
    "userId" : UUID("8f6c1295-a261-4057-9a29-8a9919437841"),
    "user" : "root",
    "db" : "admin",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
},
{
    "_id" : "admin.writeApp",
    "userId" : UUID("ee148506-1860-4739-80db-17352e0e2ccb"),
    "user" : "writeApp",
    "db" : "admin",
    "roles" : [
        {
            "role" : "dbOwner",
            "db" : "writeapp"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
 }
Run Code Online (Sandbox Code Playgroud)

退出mongo并登录

`mongo -u "writeApp" -p writeApp5299 --authenticationDatabase "admin"`
Run Code Online (Sandbox Code Playgroud)

现在,如果您在其他数据库而不是 admin 中创建了用户,那么 --authenticationDatabase "yourdbname"

现在从 mongo 执行命令。

 `use writeapp`

 ` db.testcollection.find();`
Run Code Online (Sandbox Code Playgroud)

2.如何从node.js连接:

程序1:

const mongoURI = 'mongodb://writeApp:writeApp5299@127.0.0.1:27017/writeapp';

const db = mongoose.connect(mongoURI, { useNewUrlParser: true });

程序2:

mongoose.connect('mongodb://writeApp:writeApp5299@127.0.0.1:27017/writeapp?auththSource=writeapp&w=1',{ useNewUrlParser: true });

无论您使用authSource与否,两者都有效,根本不是问题:

问题:server.js 或 app.js 首先在任何 node.js 应用程序或加载所有模块/中间件/路由等的入口点运行。
现在如果任何路由有另一个有问题的 mongodb 连接,应用程序错误很简单显示我显示的错误:

command find/insert/update requires authentication
Run Code Online (Sandbox Code Playgroud)

但问题是它没有显示哪个文件有问题。所以在每条路线中寻找问题是很耗时的。所以问题解决了