Show dbs дает ошибку "Не авторизовано для выполнения команды"

Я потратил некоторое время, пытаясь понять, что не так, но, поскольку я не мог узнать, я решил спросить здесь.

Я запускаю MongoDB (Windows 64-bit 2008 R2 +) версии 3.2.3 в Windows 8, следующие пути:

C:\MongoDB\bin для установки

C:\data\db для папки данных

Я установил следующее это видео и этот учебник из официальной документации.

Первой проблемой может быть, поскольку я действительно не знаю, является ли это вообще проблемой, соединение между клиентом (mongo.exe) и сервером (mongod.exe).

Я запустил mongod.exe через командную строку (с правами администратора), все прошло отлично, я получил сообщение:

waiting for connections on port 27017

но когда я запускаю mongo.exe через новый экземпляр командной строки, сервер (mongod.exe) не печатает сообщение о том, что есть новое соединение (это было в случае с учебниками, которые я смотрел)

С другой стороны, mongo.exe печатает

connecting to : test

Я не знаю, правильно ли все в данный момент, но я все же пробовал некоторые основные команды вроде:

show dbs возвращает not authorized on admin to execute command

В принципе, все команды, которые я пытался, имели такое же сообщение об ошибке, даже с "новым" db, который я только что создал с помощью use 'dbName'

Некоторые ответы онлайн говорят, что я должен создать пользователя с надлежащими ролями, я попробовал этот. Тем не менее то же сообщение об ошибке not authorized to execute command

Мой вопрос следующий:

Это нормально, что mongod.exe не показывает новое соединение при запуске mongo.exe? Если это правильно, то что я могу сделать, чтобы заставить работать даже основные команды?

Дополнительная информация:

Я попытался удалить/переустановить несколько раз с помощью "Пользовательский режим" и "Полный режим" в установщике Windows, но он всегда приводит к одной и той же проблеме.

Я также попытался создать службу MongoDB после официальной документации, но я не уверен, была ли это хорошая идея. (Я не могу добавить больше ссылок, но он находится в разделе во второй ссылке, которую я поделил.

Изменить раздел:

Я решил попробовать его на другом компьютере, который я не касался годами, работая на 64-разрядной версии Windows 7.

Я скопировал папку установки MongoDB в корневом каталоге этого компьютера, создал папку \data\db и запустил файл mongod.exe.

Затем я запустил mongo.exe, и на этот раз mongod.exe напечатал сообщение о том, что есть новое открытое соединение, которое нет на моем фактическом компьютере. Я думаю, проблема здесь, потому что я смог запустить базовый учебник из официальной документации и выполнить простые команды, например, создать новый db, insert, find, show dbs и т.д. Все, что я не могу сделать на своем компьютере.

Итак, я думаю, что проблема возникает из-за связи между mongod.exe и mongo.exe

У вас есть идея, как я могу решить эту проблему, поскольку я попытался удалить несколько раз.

Ответ 1

Копия ответа OP, поставленная в вопрос:

Решение

После обновления из предыдущего редактирования я немного посмотрел на соединение между клиентом и сервером, и я узнал, что даже когда mongod.exe не запускался, все еще было что-то прослушивание на порту 27017 с помощью netstat -a

Итак, я попытался запустить сервер со случайным портом, используя

[dir]mongod.exe --port 2000

Тогда оболочка с

[dir]mongo.exe --port 2000

И на этот раз сервер напечатал сообщение о новом подключении. Я набрал несколько команд, и все работает отлично, я начал основной учебник из документации, чтобы проверить, нормально ли это, и на данный момент это.

Ответ 2

Вам нужно было запустить экземпляр mongod с контролем доступа, т.е. параметр командной строки -auth, например:

$ mongod --auth

Запустите оболочку mongo и создайте администратора в базе данных admin:

$ mongo
> use admin
> db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

Теперь, если вы запустите команду "db.stats()" или "show users", вы получите сообщение об ошибке "не авторизовано для администратора для выполнения команды..."

> db.stats()
{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { dbstats: 1.0, scale: undefined }",
        "code" : 13,
        "codeName" : "Unauthorized"
}

Причина в том, что вы до сих пор не предоставили функции "read" или "readWrite" пользователю myUserAdmin. Вы можете сделать это, как показано ниже:

> db.auth("myUserAdmin", "abc123")
> db.grantRolesToUser("myUserAdmin", [ { role: "read", db: "admin" } ])

Теперь вы можете проверить его (теперь работает команда "показать пользователей" ):

> show users
{
        "_id" : "admin.myUserAdmin",
        "user" : "myUserAdmin",
        "db" : "admin",
        "roles" : [
                {
                        "role" : "read",
                        "db" : "admin"
                },
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ]
}

Теперь, если вы запустите "db.stats()", вы также будете в порядке:

> db.stats()
{
        "db" : "admin",
        "collections" : 2,
        "views" : 0,
        "objects" : 3,
        "avgObjSize" : 151,
        "dataSize" : 453,
        "storageSize" : 65536,
        "numExtents" : 0,
        "indexes" : 3,
        "indexSize" : 81920,
        "ok" : 1
}

Этот механизм пользователя и роли может быть применен к любым другим базам данных в MongoDB, а также к базе данных администратора.

(версия MongoDB 3.4.3)

Ответ 3

Создайте пользователя следующим образом:

db.createUser(
      {
        user: "myUserAdmin",
        pwd: "abc123",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
      }
    )

Затем подключите его следующим образом:

mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

Проверьте руководство:

https://docs.mongodb.org/manual/tutorial/enable-authentication/

Ответ 4

еще один, после того, как вы создаете пользователя, следуя команде cmd-1, назначьте пользователю роль чтения/записи/root с помощью cmd-2. затем перезапустите mongodb на cmd "mongod --auth".

Преимущество назначения роли пользователю заключается в том, что вы можете выполнять операции чтения/записи с помощью оболочки mongo или python/java и т.д., иначе вы встретите "pymongo.errors.OperationFailure: не авторизовано", когда вы пытаетесь прочитать/напишите свой db.

CMD-1:

use admin
db.createUser({
  user: "newUsername",
  pwd: "password",
  roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})

CMD-2:

db.grantRolesToUser('newUsername',[{ role: "root", db: "admin" }])

Ответ 5

Есть две вещи:

1) Сначала вы можете запустить экземпляр mongodb без имени пользователя и пароля.

2) Затем вы можете добавить пользователя в системную базу данных mongodb по умолчанию, используя запрос ниже.

db.createUser({
  user: "myUserAdmin",
  pwd: "abc123",
  roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})

Спасибо.