0

I develop an application in Spring Boot which is a group of microservices and run them as Docker containers. I'm using MongoDB as my database. I create Root User and User when creating Monga using the init-mongo.sh and stage_mongo.env files, then I try to connect to the database using the stage_mongo_auth.env file from other microservices. When I try to connect as Root User everything goes fine but when I try to connect as User I get an authentication error.

Error:

com.mongodb.MongoCommandException: Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server mongodb:27017. The full response is {"ok": 0.0, "errmsg": "Authentication failed.", "code": 18, "codeName": "AuthenticationFailed"}  at com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:198) ~[mongodb-driver-core-4.6.0.jar!/:na] at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:413) ~[mongodb-driver-core-4.6.0.jar!/:na]  at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:337) ~[mongodb-driver-core-4.6.0.jar!/:na] at com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:101) ~[mongodb-driver-core-4.6.0.jar!/:na]   at com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:45) ~[mongodb-driver-core-4.6.0.jar!/:na]    at com.mongodb.internal.connection.SaslAuthenticator.sendSaslStart(SaslAuthenticator.java:230) ~[mongodb-driver-core-4.6.0.jar!/:na]    at com.mongodb.internal.connection.SaslAuthenticator.getNextSaslResponse(SaslAuthenticator.java:137) ~[mongodb-driver-core-4.6.0.jar!/:na]

docker-compose.yaml

version: '3.3'
services:

  mongodb:
    image: mongo:6.0.2
    restart: unless-stopped
    env_file:
      - ../config/stage_mongo.env
    volumes:
      - ../mongodb/db:/data/db
      - ./init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh
    ports:
      - 30430:27017
    deploy:
      resources:
        limits:
          cpus: '4.0'
          memory: 2GB
    logging:
      driver: "json-file"
      options:
        tag: "mongodb"
        max-size: 256m

  api:
    image: amazoncorretto:17.0.3-alpine
    depends_on:
      - mongodb
    restart: unless-stopped
    env_file:
      - ../config/stage_mongo_auth.env
    volumes:
      - ./java/api-0.0.1-SNAPSHOT.jar:/gjava/java.jar
      - ../files:/files
    environment:
      spring_data_mongodb_host: mongodb
    command: /bin/sh -c "cd /gjava && chmod +x /gjava/*.jar && java -Xmx2g -Dspring.profiles.active=dev -jar /gjava/java.jar"
    ports:
      - 30429:30329
    deploy:
      resources:
        limits:
          cpus: '2.0'
          memory: 2GB
    logging:
      driver: "json-file"
      options:
        tag: "api"
        max-size: 256m

init-mongo.sh

mongo -- "$MONGO_INITDB_DATABASE" <<EOF
    var rootUser = '$MONGO_INITDB_ROOT_USERNAME';
    var rootPassword = '$MONGO_INITDB_ROOT_PASSWORD';
    var admin = db.getSiblingDB('admin');
    admin.auth(rootUser, rootPassword);

    var user = '$MONGO_INITDB_USERNAME';
    var passwd = '$MONGO_INITDB_PASSWORD';
    db.createUser({user: user, pwd: passwd, roles: ["readWrite"]});
EOF

stage_mongo.env

MONGO_INITDB_ROOT_USERNAME=someRootName
MONGO_INITDB_ROOT_PASSWORD=someRootPassword
MONGO_INITDB_USERNAME=someName
MONGO_INITDB_PASSWORD=somePassword
MONGO_INITDB_DATABASE=someDatabaseName

stage_mongo_auth.env

spring_data_mongodb_username=someName
spring_data_mongodb_password=somePassword

I've looked through my code several times, but I can't find the reason for this error, I've also tried to search the internet for answers, but I haven't found anything either. I will be grateful for any help.


Update 1

I found the reason why some login credentials work and others don't - commands from init-mongo.sh do not run. I removed it and got the same way to authenticate to MongoDB.

I've tried different ways to enter commands like that:

mongo <<EOF
    var rootUser = "${MONGO_INITDB_ROOT_USERNAME}";
    var rootPassword = "${MONGO_INITDB_ROOT_PASSWORD}";
    db.getSiblingDB('admin').auth(rootUser, rootPassword);

    use ${MONGO_INITDB_DATABASE}
    db.createCollection("someCollectionName")

    use admin
    db.createUser(
      {
        user: "${MONGO_INITDB_USERNAME}",
        pwd: "${MONGO_INITDB_PASSWORD}",
        roles: [ { role: "readWrite", db: "${MONGO_INITDB_DATABASE}" } ]
      }
    )
EOF

I've tried adding the :ro suffix to docker-cospose:

 volumes:
      - ../mongodb/db:/data/db
      - ./init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh:ro 

but it still doesn't work.

0 Answers0