使用身份验证将meteor / nginx应用程序连接到mongoDB

时间:2017-02-23 19:02:30

标签: mongodb authentication meteor nginx

我有一个带有nginx的流星应用程序,并且在同一台服务器上我有一个mongoDB数据库,它有一个身份验证。 当我想在ssh中连接数据库时,它可以正常使用身份验证。 但在流星应用程序上,我总是遇到502错误的网关错误。 我认为这是因为应用程序无法连接到数据库,但我不知道如何连接它。 在文件/etc/init/myapp.conf上,我更改了mongo url:

    export MONGO_URL=mongodb://user:password@127.0.0.1:27017/myapp

但我总是遇到同样的问题。

在文件/var/log/mongodb/mongodb.log中,我有以下错误:

[initandlisten] connection accepted from 127.0.0.1:45266 #2680 (3 connections now open)
[conn2680] assertion 16550 not authorized for query on myapp.system.indexes ns:myapp.system.indexes query:{ ns: "myapp.users"$
[conn2680]  ntoskip:0 ntoreturn:1000
[conn2680] end connection 127.0.0.1:45266 (2 connections now open)
[initandlisten] connection accepted from 127.0.0.1:45268 #2681 (3 connections now open)
[conn2681] assertion 16550 not authorized for query on myapp.system.indexes ns:myapp.system.indexes query:{ ns: "myapp.users"$
[conn2681]  ntoskip:0 ntoreturn:1000
[conn2681] end connection 127.0.0.1:45268 (2 connections now open)

当我删除数据库中的身份验证时,它工作正常,但我需要此身份验证。

您知道如何通过身份验证将应用程序连接到数据库吗?

更新 在文件/home/myapp/myapp.log中,我有:

Exception in setInterval callback: MongoError: not authorized for update on myapp.users
at Object.Future.wait (/home/myapp/bundle/programs/server/node_modules/fibers/future.js:449:15)
at [object Object].<anonymous> (packages/meteor.js:213:24)
at [object Object].MongoConnection.(anonymous function) [as update] (packages/mongo/mongo_driver.js:774:49)
at [object Object].update (packages/mongo/collection.js:581:29)
at AccountsServer.Ap._expireTokens (packages/accounts-base/accounts_server.js:1115:14)
at packages/accounts-base/accounts_server.js:1204:14
at [object Object]._.extend.withValue (packages/meteor.js:1122:17)
at packages/meteor.js:445:45
at runWithEnvironment (packages/meteor.js:1176:24)
- - - - -
at Function.MongoError.create (/home/myapp/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb-core/lib/error.js:31:$
at toError (/home/myapp/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/utils.js:114:22)
at /home/myapp/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/collection.js:1047:60
at getLastErrorCallback (/home/myapp/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb-core/lib/wireprotocol/2_4_s$
at /home/theroofwebapp/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb-core/lib/connection/pool.js:455:18
at process._tickCallback (node.js:355:11)

2 个答案:

答案 0 :(得分:0)

以下是您需要仔细检查的一些内容。

  1. 确保在您启动Meteor应用的任何地方导出export MONGO_URL。您提到您正在使用/etc/init/myapp.conf中的readWrite。这听起来不是正确的地方。

  2. 确保您实际上在mongodb连接字符串中包含您的真实用户名和密码,并且连接字符串使用的是mongodb实际运行的正确端口。您在问题中包含的内容是一个通用示例,但也包含您的应用程序名称,因此不清楚这是否实际上是您正在使用的。

  3. 仔细检查您为Meteor应用程序使用的mongodb用户设置的角色。确保你至少扮演db.createUser( { user: "meteor", pwd: "meteor", roles: [ { role: "readWrite", db: "meteor_app" } ] } ); 的角色。这是一个例子。

    driver.findElement(By.id("element id")).click()
    

答案 1 :(得分:0)

连接到mongo shell并以管理员身份进行身份验证,然后尝试以下

use admin
db.system.users.update({"user" : "your_user"}, {$addToSet: {'otherDBRoles.myapp': 'readWrite'}}, false, false)

将您的db用户名和myapp替换为您的目标数据库名称