MongoDB自定义用户角色-“不允许用户(...)”

时间:2018-12-15 18:05:52

标签: node.js mongodb mongoose connection mongodb-atlas

我在MongoDB Atlas(具有3个分片)上创建了一个免费层集群,并且我希望我的Node.js应用程序使用特定用户连接到在那里创建的数据库,该数据库将被禁止使用除这个应用程式专用的。

所以一步一步来

我创建了一个名为test的数据库。

我创建了一个角色here-我去了Security -> MongoDB Roles -> Add New Custom Role,并将所有Collection actions和所有Database actions and roles都交给了test

用户的时间,因此,Security -> MongoDB Users -> Add New User再一次给我分配了一个先前创建的角色,因此它只能访问test数据库。所以现在我有2个用户-atlasAdmin和我创建的用户。

问题出在哪里,当我在应用中使用管理员用户连接.find().create()时,它一直可以正常工作。对于具有自定义角色的用户,它的工作方式类似于10分钟/ 1连接(直到关闭我已打开节点应用程序的本地服务器),下一次出现错误消息“不允许用户执行操作(。 )”。

我尝试了一切,修改了用于连接的字符串,更新了mongoose(我在应用程序中使用了它),使用mongodb shell创建了用户和自定义角色,但似乎无济于事。

但是:

  • 如果我有这个自定义用户,我的应用程序将其连接到数据库并且可以正常工作,然后在下一个连接上它停止工作,我进入here,然后单击UPDATE USER,而没有更改那里的任何内容(我只需单击用户旁边的edit,然后单击update),然后等待集群进行更改,它将再次工作,例如+/-一个连接。

    < / li>
  • 如果我的应用使用管理员帐户,一切都可以正常工作

有人有类似的问题吗? Screenshot of the error我也在想,这可能是因为我尝试从应用程序连接mongo的次数(我使用nodemon,所以每次我保存更改后的文件时,服务器都会重新启动,从而连接到数据库)),但事实并非如此-如果是这样,为什么我可以使其与管理员用户一起使用?

我用来连接mongo的字符串:

// DATABASE SETUP var dbURL = 'mongodb://[cluster0:port],[cluster1:port],[cluster2:port]/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true'; var options = { useNewUrlParser: true, dbName: "test" user: [login], pass: [pass] }; mongoose.connect(dbURL, options);

1 个答案:

答案 0 :(得分:0)

我也在Atlas Free层上遇到了这个问题,不仅在NodeJS上,也在Java上

目前,您可以尝试使用默认角色而不是使用自定义角色来缓解此问题

在“ MongoDB用户”选项卡上,单击用户上的“编辑” =>添加默认权限

Picture 1

然后选择“ readWrite”,并在第一个字段中输入数据库名称,然后保存用户

Picture 2

或者,如果要进行数据库管理,请添加另一个具有“ dbAdmin”角色的字段

Picture 3

至少我是这样解决的。我希望这会有所帮助。

旁注:您也可以使用较短的连接字符串(MongoDB + SRV),它仍然可以使用。