Ответы пользователя по тегу MongoDB
  • Исчезли БД MongoDB?

    Lobotomist
    @Lobotomist
    Software Developer
    Если сделать как вы описали - авторизация происходит успешно. Вероятно, где-то в процессе настройки, либо авторизации была допущена ошибка - например, пользователь создан не в той базе или что-то еще.

    Листинг моей проверки
    docker volume create testvol
    
    docker run --rm --name test-mongo -v "testvol:/data/db" -d mongo
    docker exec -it test-mongo mongo
    use testDb;
    db.createCollection("testCollection");
    use admin;
    
    db.createRole({
    role: "Admin",
    privileges: [{
    resource: {
    db: "testDb",
    collection: "testCollection"
    },
    actions: ["anyAction", "internal"]
    }],
    roles: []
    });
    
    db.createUser({
    user: "Admin",
    pwd: "testpasswd",
    roles: ["Admin"]
    });
    
    db.adminCommand({"listDatabases":1, "filter": {"name": "testDb"}, "nameOnly": true});
    // { "databases" : [ { "name" : "testDb" } ], "ok" : 1 }
    docker stop test-mongo
    
    docker run --rm -v "testvol:/data/db" --name test-mongo -d mongo --auth
    
    docker exec -it test-mongo mongo
    db.adminCommand({"listDatabases":1, "filter": {"name": "testDb"}, "nameOnly": true});
    //{
    //        "ok" : 0,
    //        "errmsg" : "command listDatabases requires authentication",
    //        "code" : 13,
    //        "codeName" : "Unauthorized"
    //}
    
    use admin;
    db.auth("Admin", "testpasswd");
    // 1
    db.adminCommand({"listDatabases":1, "filter": {"name": "testDb"}, "nameOnly": true});
    // { "databases" : [ { "name" : "testDb" } ], "ok" : 1 }


    При отключенной авторизации все базы данных должны быть вам видны по идее. Возможно, созданный пользователь как-то мешает их видеть в админках, через которые вы проверяете, так что используйте команду `listDatabases` для чистоты эксперимента. Запустите базу с отключенной авторизацией, проверьте, что база есть. Если ее нет - вероятно тут уже проблема не связанная с авторизацией - напишите тут об этом. Найдите, где у вас создан пользователь Admin и удалите его.

    docker run --rm -v "testvol:/data/db" --name test-mongo -d mongo
    docker exec -it test-mongo mongo

    use admin;
    // switched to db admin
    db.getUsers();
    // [{ "_id" : "admin.Admin", ...
    db.dropUser("Admin");
    // true


    После этого можно настроить пользователя заново. Возможно, имеет смысл создать "суперпользователя" - пользователя, под которым вы сможете администрировать базу без необходимости перезапускать сервер с отключенной авторизацией. Ведь пользователю Admin вы выдаете права только на одну коллекцию, а не на инстанс и он, я так понимаю, не сможет ни создать дополнительных бд, ни коллекций, ни пользователей.
    Для этого можно использовать роль root, например.

    И уже под этим пользователем продолжайте настройку.

    Отмечу, что насчет разрешений, которые вы выдаете вашему пользователю написано:
    > Do not assign this action unless it is absolutely necessary.

    Стоит ему выдать ровно те разрешения, которые ему необходимы для текущей работы, а остальное делать из-под "суперпользователя".
    Ответ написан
    Комментировать
  • MongoDB GridFS PHP - как прочитать пример?

    Lobotomist
    @Lobotomist
    Software Developer
    Команду можно разделить на части, чтобы проще было разбираться.

    Получаем объект коннекта к базе (MongoDB\Client)
    $connection = new MongoDB\Client;

    Получаем объект MongoDB\Database для работы с конкретной БД. Тут используется магический метод __get, в документации написано:
    Selects a database on the server. This magic method is an alias for the selectDatabase() method.

    То есть следующие команды делают одно и тоже.
    $database = $connection->example;
    $database = $connection->selectDatabase("example");


    Ну и теперь получаем объект MongoDB\GridFS\Bucket для работы с хранилищем файлов в базе $database
    $bucket = $database->selectGridFSBucket();

    Возможно, я как-то не так понял, в чем ваша проблема - так что задавайте доп. вопросы в комментариях
    Ответ написан
    1 комментарий