【发布时间】:2018-04-25 12:01:26
【问题描述】:
我的 MongoDB 服务器中有 3 个数据库。我正在使用 pymongo 用 Python3 编写一些脚本。
我想使用最新的版本和做法。一旦我打开客户端并选择数据库, pymongo.MongoClient.['mydatabase'].authenticate 的 API 将被弃用。 https://api.mongodb.com/python/current/api/pymongo/database.html
选择数据库之前的身份验证(在拨打客户端时)似乎不会向下流向数据库。不仅适用于 pymongo,还适用于我使用 mongo shell 时。所以我觉得这就是问题所在。
脚本.py
import pymongo
from pymongo import MongoClient
u = getUser() # function which prompts for username
p = getPassword() # getpass.getpass('Password')
uri = formatUri(u, p) # formats 'mongodb://%s:%s@%s'.format(user, password, host)
client = MongoClient(uri)
db = client['mydb']
col = db.mycollection
for doc in col.find():
print(doc)
我收到我没有获得数据库授权的错误。我知道我的帐户在 shell 中工作,但我必须先拨打客户端,然后使用数据库,然后再使用身份验证。
这是一个 mongo shell 示例:
$ mongo
MongoDB shell version: v3.4.10
Connecting to: mongodb://127.0.0.1:port
MongoDB server version: v3.4.10
> use mydb
switched to mydb
> db.auth("user", "pass")
1
知道如何在选择数据库后进行身份验证,或者在使用数据库后它会记住我拨打的上下文吗?
【问题讨论】:
-
其意图是所有身份验证都存储在
"admin"中,并简单地标识帐户具有可用权限的数据库命名空间。因此,您可以为"mydb"的用户分配特权,但没有要求您单独“登录”该数据库。它只是意味着如果您切换到没有分配权限的"foo"数据库命名空间,那么您“无法做任何事情”。如果您拥有“两个”数据库命名空间的权限,那么您就可以访问事物而无需再次“验证”。是不是更清楚一些? -
我最初认为它是这样工作的。例如,在不使用数据库的情况下,我创建了具有 admin 中所有权限的 mongo 用户,具有几乎所有可能的访问权限,而另一个用户仅具有读取权限。然后我将使用该主帐户进行身份验证(仍在管理员中)。然后切换并使用“mydb”,当我在 mydb 中“显示用户”时,什么都没有显示。所以我想我必须在 mydb 中重新创建帐户并授予访问权限。
-
您认为提供的答案中是否有某些内容无法解决您的问题?如果是这样,那么请对答案发表评论,以澄清究竟需要解决哪些尚未解决的问题。如果它确实回答了您提出的问题,请注意Accept your Answers您提出的问题
-
确实如此。这对我来说很有意义,因为这是我第一次期望它工作的方式,并且我意识到我在同一个数据库中创建了单独的用户。但是,当我尝试在
admin中创建新用户时,我仍然无法使用 d.auth() 登录我正在使用的数据库。 (此时我只使用 shell,因为我意识到问题从来不是 pymongo)。我相信我可能不得不重新安装 mongo 并开始清理,因为我一直在搞乱用户、配置等。 -
您将获得一个干净的案例,其中显示了干净的数据库的启动和可重现的步骤,以便您可以运行和复制并查看正确的过程是什么。一旦您可以看到正确的流程是什么并且答案解决了实际询问的内容,那么这里的流程就是"accept the answer",以便向查看问题及其答案的其他人表明它的正确性。