Ошибка авторизации при динамическом создании новой базы данных MongoDB с использованием драйвера PHP MongoDB

Я пытаюсь создать новую базу данных mongoDB во время выполнения с помощью кода php/Laravel: -

Первоначально я создал пользователя mongodb через mongoshell следующим образом:

use test_mongodb;

db.createUser({user: "test_mongodbu", pwd: "test_password", roles: [{ role: "dbOwner", db: "test_mongodb"}]})

В моем файле env у меня есть такие данные: -

MONGODB_CONNECTION=mongodb
MONGODB_HOST=localhost
MONGODB_PORT=27017
MONGODB_DATABASE=test_mongodb
MONGODB_USERNAME=test_mongodbu
MONGODB_PASSWORD=test_password
MONGODB_MASTER_DATABASE=test_mongodb

Я динамически создаю новую базу данных через php MongoDrive следующим образом: -

use MongoDB\Client as MongoClient;
use MongoDB\Driver\Manager as MongoManager;
use MongoDB\Driver\Command as MongoCommand;

$databaseName      = $username; // 'little_buds'
$collectionName    = 'test'; 
$connectionString  = 'mongodb://' . env('MONGODB_USERNAME') . ':' . env('MONGODB_PASSWORD') . '@' . env('MONGODB_HOST') . ':' . env('MONGODB_PORT') . '/?authSource=' . env('MONGODB_DATABASE');

$client     = new MongoClient($connectionString);  // Connect to MongoDB server
$manager    = new MongoManager($connectionString); 
$database   = $client->$databaseName;              // Dynamically create a database
$command    = array(
                'grantRolesToUser'  => env('MONGODB_USERNAME'),
                'roles'             => array(
                                        array(
                                            'role'  => 'dbOwner', 
                                            'db'    => $databaseName
                                        )
                                    )
            ); // command to grant the role of 'dbOwner' to existing user test_mongodbu

$manager->executeCommand(env('MONGODB_DATABASE'), new MongoCommand($command)); // executing the command
$database->$collectionName->insertOne(array('key' => 'value'));  // Insert a document into a collection

Моя идея состоит в том, чтобы создать новую базу данных (скажем little_buds) и предоставить роль «dbOwner» уже существующему test_mongodbu пользователю базы данных test_mongodb

Я получаю эту ошибку-

Not authorized on little_roses to execute command { insert: "test", ordered: true, $db: "little_buds", lsid: { id: UUID("d9ca3d5f-4299-4545-a487-7c565bc59ed4") } }

Что я делаю не так? Нужно ли мне обновлять разрешение пользователя — например, с roles: [{ role: "dbOwner", db: "lppportal_mongodb"}] на roles: [{ role: "userAdminAnyDatabase", db: "lppportal_mongodb"}]?

Отвечает ли это на ваш вопрос? Ошибка аутентификации при попытке сохранить в mongodb

Wernfried Domscheit 27.06.2024 14:36

@WernfriedDomscheit Нет, это не так.

Saswat 27.06.2024 16:17

Вы уверены? В какой базе данных вы создали пользователя?

Wernfried Domscheit 27.06.2024 19:00

Это не ошибка аутентификации, это ошибка авторизации. Проверьте журнал mongod для этого соединения, вы должны найти запись журнала «Успешная аутентификация», которая сообщит вам, какой пользователь/база данных была аутентифицирована. Также обратите внимание, что имя базы данных — «little_buds», были ли у вашего пользователя какие-либо привилегии в отношении этой базы данных?

Joe 27.06.2024 23:49

@Джо, я немного изменил свой вопрос. пожалуйста, проверьте

Saswat 28.06.2024 07:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В принципе вам нужно будет создать пользователя со следующими ролями:

use test_mongodb;
db.createUser({
   user: "test_mongodbu", 
   pwd: "test_password", 
   roles: [
      { role: "dbOwner", db: "test_mongodb"},
      { role: "readWrite", db: "lppportal_mongodb"}
   ]
})

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

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

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

Вы должны создать пользователя, например, в базе данных admin.

db.getSiblingDB('admin').createUser({
   user: "test_mongodbu", 
   pwd: "test_password", 
   roles: [
      { role: "dbOwner", db: "test_mongodb"},
      { role: "readWrite", db: "lppportal_mongodb"}
   ]
})

В этом случае строка подключения должна быть такой:

 $connectionString  = 'mongodb://' 
   . env('MONGODB_USERNAME') . ':' . env('MONGODB_PASSWORD') 
   . '@' . env('MONGODB_HOST') . ':' . env('MONGODB_PORT') 
   . '/' . env('MONGODB_DATABASE') . '?authSource=admin';

  -> 'mongodb://test_mongodbu:test_password@localhost:27017/test_mongodb?authSource=admin'

Другие вопросы по теме