MongoDB 自定义用户角色 - "user is not allowed(...)"
MongoDB custom user roles - "user is not allowed(...)"
我在 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 个连接(直到我关闭我的节点应用程序所在的本地服务器),下次我收到 "user is not allowed to perform action (...)" 的错误。
我尝试了一切,修改我用来连接的字符串,更新 mongoose
(我在我的应用程序中使用它),使用 mongodb shell 创建用户和自定义角色但似乎没有任何效果。
但是:
如果我有这个自定义用户,我的应用程序会与它连接到数据库并且它可以工作,然后在下一个连接上它停止工作我去here然后点击UPDATE USER
不做任何更改(我只需单击用户旁边的 edit
,然后单击 update
),然后等待集群进行更改,它会再次为 +/- 一个连接工作。
如果我的应用使用管理员帐户,一切正常
有人遇到过类似的问题吗? 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);
我在 Atlas Free tier 上也遇到过这个问题,不仅在 NodeJS 上,Java
现在,您可以尝试使用默认角色而不是自定义角色来缓解此问题
在 MongoDB 用户选项卡上,单击您的用户 "Edit" => 添加默认权限
Picture 1
然后 select "readWrite" 并在第一个字段中键入您的数据库名称,然后保存用户
Picture 2
或者,如果您想要数据库管理,请添加另一个具有 "dbAdmin" 角色的字段
Picture 3
至少我是这样解决的。希望对您有所帮助。
旁注:您也可以使用较短的连接字符串 (MongoDB+SRV),它仍然有效。
我在 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 个连接(直到我关闭我的节点应用程序所在的本地服务器),下次我收到 "user is not allowed to perform action (...)" 的错误。
我尝试了一切,修改我用来连接的字符串,更新 mongoose
(我在我的应用程序中使用它),使用 mongodb shell 创建用户和自定义角色但似乎没有任何效果。
但是:
如果我有这个自定义用户,我的应用程序会与它连接到数据库并且它可以工作,然后在下一个连接上它停止工作我去here然后点击
UPDATE USER
不做任何更改(我只需单击用户旁边的edit
,然后单击update
),然后等待集群进行更改,它会再次为 +/- 一个连接工作。如果我的应用使用管理员帐户,一切正常
有人遇到过类似的问题吗? 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);
我在 Atlas Free tier 上也遇到过这个问题,不仅在 NodeJS 上,Java
现在,您可以尝试使用默认角色而不是自定义角色来缓解此问题
在 MongoDB 用户选项卡上,单击您的用户 "Edit" => 添加默认权限
Picture 1
然后 select "readWrite" 并在第一个字段中键入您的数据库名称,然后保存用户
Picture 2
或者,如果您想要数据库管理,请添加另一个具有 "dbAdmin" 角色的字段
Picture 3
至少我是这样解决的。希望对您有所帮助。
旁注:您也可以使用较短的连接字符串 (MongoDB+SRV),它仍然有效。