Я пытаюсь создать новую базу данных 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"}]
?
@WernfriedDomscheit Нет, это не так.
Вы уверены? В какой базе данных вы создали пользователя?
Это не ошибка аутентификации, это ошибка авторизации. Проверьте журнал mongod для этого соединения, вы должны найти запись журнала «Успешная аутентификация», которая сообщит вам, какой пользователь/база данных была аутентифицирована. Также обратите внимание, что имя базы данных — «little_buds», были ли у вашего пользователя какие-либо привилегии в отношении этой базы данных?
@Джо, я немного изменил свой вопрос. пожалуйста, проверьте
В принципе вам нужно будет создать пользователя со следующими ролями:
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'
Отвечает ли это на ваш вопрос? Ошибка аутентификации при попытке сохранить в mongodb