【问题标题】:OperationFailure: not authorized on tracking to execute commandOperationFailure:未授权跟踪执行命令
【发布时间】:2016-03-14 11:03:05
【问题描述】:

我做了以下

-- `sudo apt-get install mongodb-org`
-- go to `etc/mongod.conf` change bindIp to: `0.0.0.0`
-- sudo mkdir /data/db
-- start without auth to create user
    `sudo mongod --port 27017 --dbpath /data/db`
-- open shell with : mongo --port 27017

```
> use admin
> db.createUser( { user: "useradmin", pwd: "mypassword", roles: [ { role: "root", db: "admin" } ] } )

```

-- Restart with auth required(ctrl+c the above mongod process): 
`sudo mongod --auth --port 27017 --dbpath /data/db'

-- To open shell(ctrl+c above mongo shell): 
`mongo --port 27017 -u useradmin -p mypassword --authenticationDatabase admin`

我的 mongoengine_settings.py

```PYTHON
from mongoengine import connect

DATABASE = 'tracking'
USERNAME = 'useradmin'
PASSWORD = 'mypassword'
HOST = 'mongodb://localhost/tracking'
PORT = 27017

connect(DATABASE, 
        username=USERNAME, 
        password=PASSWORD,
        host=HOST,
        port=PORT
        )

```

现在,当我尝试使用 mongoengine 批量插入一些数据时,如果我没有启用 --auth,它可以正常工作,否则会引发以下错误:

OperationFailure(u'command SON([(\'createIndexes\', u\'order\'), (\'indexes\', [{\'unique\': True, \'background\': False, \'sparse\': False, \'key\': SON([(\'order_id\', 1)]), \'name\': u\'order_id_1\'}])]) on namespace tracking.$cmd failed: not authorized on tracking to execute command { createIndexes: "order", indexes: [ { unique: true, background: false, sparse: false, key: { order_id: 1 }, name: "order_id_1" } ] }',)

我做错了什么?

【问题讨论】:

    标签: mongodb mongoengine


    【解决方案1】:

    MongoDB 用户是在特定数据库中创建的,而不是在实例级别创建的。一旦创建了用户,就可以为不同的数据库授予不同的角色。创建用户的数据库称为authentication database

    由于用户名不是唯一的(只有用户名和身份验证数据库的组合),您可以在不同的数据库中创建两个具有不同角色和密码的同名用户。这也意味着在连接时需要指定身份验证数据库以及用户名和密码。

    这就是为什么在admin 数据库中创建useradmin 用户后,您需要运行以下命令:

    mongo --port 27017 -u useradmin -p mypassword --authenticationDatabase admin

    将 MongoDB shell 连接到默认数据库 test

    如果您没有明确指定身份验证数据库,那么 MongoDB 会假定您要连接的数据库也是身份验证数据库。所以像这样连接到管理数据库就可以了:

    mongo --port 27017 -u useradmin -p mypassword admin

    这三个命令实际上是相同的,都将返回“身份验证失败”错误:

    mongo --port 27017 -u useradmin -p mypassword mongo --port 27017 -u useradmin -p my password test mongo --port 27017 -u useradmin -p my password test --authenticationDatabase test


    要从 Python 进行连接,如果您使用 MongoClient 并向其传递完整的 MongoDB URI,则连接字符串可以包含可选参数。其中一个选项是 authSource(与用户凭据关联的数据库名称),这显然是您需要的:connection options

    您的 URI 将如下所示:

    MdbURI = "mongodb://useradmin:mypassword@localhost:27017/tracking?authSource=admin" client = MongoClient(MdbURI)

    【讨论】:

      【解决方案2】:

      这里有一种使用 pymongo 连接和验证的方法:

      from pymongo import MongoClient
      
      # MongoDB connection info
      hostname = '10.20.30.40'
      port = 27017
      username = 'adminUserName'
      password = 'secret'
      databaseName = 'someDB'
      
      # connect with authentication
      client = MongoClient(hostname, port)
      db = client[databaseName]
      db.authenticate(username, password)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-30
        • 2018-04-06
        • 1970-01-01
        • 1970-01-01
        • 2016-03-16
        • 2019-07-25
        • 1970-01-01
        相关资源
        最近更新 更多