Mongoose 连接认证失败

问题描述 投票:0回答:15

在这个帮助下,我在 mongo shell 中创建了一个超级用户:在 mongo 中创建超级用户

user: "try1"
passw: "hello"

在 mongo cmd 中,我有 3 个数据库:'admin'、'myDatabase' 和 'local'。

现在我尝试使用此授权连接到名为“myDatabase”的数据库。

mongoose.connect('mongodb://try1:hello@localhost:27017/myDatabase');

但这就是我得到的错误:

名称:'MongoError',
消息:“身份验证失败。”,
好的:0,
errmsg: '身份验证失败。',
代码:18,
代码名称:'身份验证失败'}
猫鼬已断开连接
Mongoose 通过 ${msg} 断开连接

node.js mongodb mongoose
15个回答
47
投票

我几个小时前也遇到了同样的问题,最终我解决了。我的代码是:

mongoose.createConnection(
  "mongodb://localhost:27017/dbName",
  {
    "auth": {
      "authSource": "admin"
    },
    "user": "admin",
    "pass": "password"
  }
);

24
投票

这是现在的正确答案。其他的并不完全正确。

await mongoose.connect("mongodb://localhost:27017/db", {
    poolSize: 10,
    authSource: "admin",
    user: "admin",
    pass: "password",
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    useFindAndModify: false 
});

21
投票

除了@kartGIS,我还添加了一个选项以使连接代码尽可能完美。

mongoose.connect("mongodb://localhost:27017/databaseName", {
    "auth": { "authSource": "admin" },
    "user": "username",
    "pass": "password",
    "useMongoClient": true
});

16
投票

语法:

await mongoose.connect('mongodb://username:password@host:port/database?authSource=admin');

示例:

await mongoose.connect('mongodb://myUser:myPassword@localhost:27017/myDataBase?authSource=admin');

11
投票

在 Mongodb 4.2 和 Mongoose 5.7.13 上工作得很好

Node.js

const Connect = async () => {

    let url = "mongodb://localhost:27017/test_db";

    try {

        let client = await Mongoose.connect( url, {
            poolSize: 10,
            authSource: "admin",
            user: "root",
            pass: "root123", 
            useCreateIndex: true,
            useNewUrlParser: true,
            useUnifiedTopology: true
        } );

        log( "Database is connected!" );
    } catch ( error ) {
        log( error.stack );
        process.exit( 1 );
    }

}
Connect();

/etc/mongod.conf

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27017
  bindIp: 0.0.0.0 

setParameter:
   enableLocalhostAuthBypass: false

security:
  authorization: enabled

数据库用户

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

show users;
{
   "_id": "admin.root",
   "userId": UUID( "5db3aafd-b1fd-4bea-925e-8a4bfb709f22" ),
   "user": "root",
   "db": "admin",
   "roles": [ {
        "role": "userAdminAnyDatabase",
        "db": "admin"
      },
      {
        "role": "readWriteAnyDatabase",
        "db": "admin"
      }
   ],
   "mechanisms": [
       "SCRAM-SHA-1",
       "SCRAM-SHA-256"
   ]
}

6
投票

我有同样的问题,通过删除 'authSource' 参数解决了

/* Not working */
mongoose.connect("mongodb://localhost:27017/test", {
    "auth": { "authSource": "admin" },
    "user": "admin",
    "pass": "admin123",
    "useMongoClient": true
});

/* Working */
mongoose.connect("mongodb://localhost:27017/test", {
    "user": "admin",
    "pass": "admin123",
    "useMongoClient": true
});

在 Mongoose-v5.0.0 上测试。


3
投票

这是猫鼬 6.7.0 的答案!用于 NUXT 3

.env 部分

MONGO_URI = "mongodb://localhost:27017/MyBeautifulDB"
MONGO_USERNAME = "mongoadmin"
MONGO_PASSWORD = "mystrongpassword"

数据库连接部分

import mongoose from 'mongoose';

export default async (_nitroApp) => {
const config = useRuntimeConfig();

mongoose.connect(config.MONGO_URI, {
        maxPoolSize: 10,
        authSource: "admin",
        user: config.MONGO_USERNAME,
        pass: config.MONGO_PASSWORD
    })
    .then(() => console.log('Connected to DB'))
    .catch((e) => console.log(e));
}

nuxt.config.ts - 将数据库连接文件注册到配置。

export default defineNuxtConfig({
    runtimeConfig: {
        MONGO_URI: process.env.MONGO_URI,
    },

    nitro: {
        plugins: ['@/server/db/index.ts']
    }
})

2
投票

使用上述答案时我得到了

MongoParseError: credentials must be an object with 'username' and 'password' properties

将用户名密码添加到身份验证对象解决了问题

  try {
    await connect("mongodb://localhost:27017/dbname", {
      auth: { username: "root", password: "example" },
      authSource: "admin",
    });
    console.log("Connected to mongo db");
  } catch (error) {
    console.error("Error connecting to mongodb", error);
  }

mongodb版本5.0.2
猫鼬 6.0.4


2
投票

分别,如果您的

authSource
是数据库(示例中的“myDB”)本身,并且您尝试使用
ConnectionOption
dbName
,则必须匹配
authSource

await mongoose.connect('mongodb://localhost:27017,' {
  dbName: 'myDB',
  user: 'myUser',
  pass: 'asldjaskdj'
);

会因错误而失败:

{
    "msg": "Authentication failed",
    "attr": {
        "mechanism": "SCRAM-SHA-1",
        "principalName": "myUser",
        "authenticationDatabase": "admin",
        "client": "...",
        "result": "UserNotFound: Could not find user \"myUser\" for db \"admin\""
    }
}

authSource: 'myDB'
添加到连接选项即可。示例:

await mongoose.connect('mongodb://localhost:27017,' {
  dbName: 'myDB',
  authSource: 'myDB',
  user: 'myUser',
  pass: 'asldjaskdj'
);

1
投票

我也有同样的问题。我正在使用较旧的 MongoDB 实例。我只是将

authSource=admin
添加到连接字符串中,就解决了问题。


1
投票

根据最新的文档,应该是这样的:

mongoose.connect("mongodb://localhost:27017/databaseName", {
    "user": "username",
    "pass": "password",
    "authSource": "databaseName" // users are scoped to DBs
});

在猫鼬上测试

6.x.x


1
投票

对我有用。我使用本地数据库,mongoose 版本 6.9.1

.env 文件:

DB_HOST=127.0.0.1:27017
DB_NAME=blabla
DB_USER=blablabla
DB_PWD=blablablabla

js文件:

const DB = `mongodb://${process.env.DB_HOST}/${process.env.DB_NAME}`;

mongoose
  .connect(DB, {
    authSource: 'admin',
    user: process.env.DB_USER,
    pass: process.env.DB_PWD,
  })
  .then(() => {
    console.log('Connected to database.');
  })
  .catch((err) => {
    console.log(err.message);
  });

0
投票

注意 这个答案不是回答原来的问题,而是试图使用 NestJS 帮助处于类似情况的人

NestJS

@Module({
  imports: [
    MongooseModule.forRoot(
      'mongodb://mongo:27017/test',
      {
        auth: {
          username: 'root',
          password: 'test',
        },
        authSource: 'admin',
      },
    ),
  ],
})
export class AppModule {}

0
投票

它帮助我在选项中写下我需要的所有内容:

等待 mongoose.connect("mongodb://localhost:27017", { 用户:“根”, 通过:“秘密”, 数据库名称:“motos”, });


-2
投票

我也遇到了同样的问题,但用这个解决了 猫鼬.connect(

mongodb://${dbUser}:${dbPwd}@${dbHost}:${dbPort}/userInfo?authSource=admin
)。假设您在 mongodb 中设置了身份验证。

© www.soinside.com 2019 - 2024. All rights reserved.