Аутентификация MongoDB для inMemoryDB?

#mongodb #authentication

#mongodb #аутентификация

Вопрос:

Поддерживает ли MongoDB in-memory Db аутентификацию?

Я использую аутентификацию в экземплярах mongo. Создан пользователь-администратор для обоих wiredTiger и in-memory DB . При подключении к wiredTiger нему подключается, но не с in-memory DB .

Комментарии:

1. На странице механизма хранения в памяти написано следующее: «Непостоянные данные включают данные приложения и системные данные, такие как пользователи, разрешения, …». Так что да, похоже, аутентификация / авторизация должны работать и там.

2. но когда я выполняю эти шаги, приведенные в документе mongo docs.mongodb.com/manual/tutorial/enable-authentication и перезагрузитесь после создания пользователя, после чего пользователь там больше не существует.

3. Какой пользователь, из admin БД? Не может быть. Но пользователь для вашей базы данных в памяти, конечно, исчез. Вы должны воссоздать его во время настройки этой базы данных.

4. Итак, я должен создавать пользователя каждый раз, когда запускаю базу данных в памяти? Также как я могу создать пользователя при запуске в режиме с включенной авторизацией, поскольку в это время я не могу подключиться к imdb.?

Ответ №1:

Это то, что сработало для меня:

  • "mongodb-memory-server": "^8.9.0",
  • "jest": "^27.2.5",
  • "@nestjs/mongoose": "^9.0.3",
 import { MongoMemoryServer } from 'mongodb-memory-server';
let mongo: MongoMemoryServer;
//..

mongo = await MongoMemoryServer.create({
// Not recommended as every instance will spawn on a random port.
  // instance: { port: 27017 }, 
  binary: { version: '4.0.28' },
  auth: {
    // Add the root user
    customRootName: 'root-username',
    customRootPwd: 'root-password',
    // Add additional users
    extraUsers: [
      {
        createUser: 'other-username',
        pwd: 'other-password',
        roles: [
          { role: 'readWrite', db: 'db-name' },
        ]
      }
    ]
  }
});
// Get the URI including random port
const mongoUri = await mongo.getUri();
//.. connect
  

При подключении убедитесь, что вы указали учетные данные для аутентификации, включая:

  • username , password , database (имя базы данных предоставлено для чтения)

Полезные опции Jest

 "test": "jest --maxWorkers=4 --force-exit --detectOpenHandles",
"test:mongo:debug": "MONGOMS_DEBUG=1 jest --maxWorkers=4 --force-exit --detectOpenHandles",
  
  • MONGOMS_DEBUG=1 включите режим отладки для базы данных в памяти. Очень полезно выяснить, что происходит.
  • --force-exit последнее средство для завершения процесса после запуска тестов, но рассмотрите mongoose.disconnect() и await mongo.stop(); не торопитесь.

Полезные ссылки:

Docker для интеграционных тестов

 version: "3.7"
services:
db-mongo-service-test:
  image: mongo:4.0.28                           # Build from MongoDB image
  container_name: db-mongo-test                 # Name the container
  environment:
    MONGO_INITDB_DATABASE: db-name              # Set Database Name
    MONGO_INITDB_ROOT_USERNAME: root-username   # Set root username
    MONGO_INITDB_ROOT_PASSWORD: "root-password" # Set root user password
  volumes:                                      # Add a non-root user via init script.
    - ./server/scripts/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
  ports:
    - 27020:27020
    - 27017:27017