2

I am building a web server in Go and I want to use two different users for different purposes, an admin user and a regular user with r/w access. When I try to authenticate

client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://<username>:<password>@host:port"))

the admin account gets connected, but the regualr user throws an error. The error says:

"2019/11/20 06:34:58 client is disconnected
exit status 1"  

The docker-compose file is as follows:

version: "3.6"
services:
  mongo:
    image: mongo
    container_name: mongo_database
    ports:
    - "27017:27017"
    volumes:
    - ./init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh
    - ../../db/data-volume:/data/db
    command: mongod --auth
    environment:
      - MONGO_INITDB_ROOT_USERNAME_FILE=/run/secrets/mongo_admin_user
      - MONGO_INITDB_ROOT_PASSWORD_FILE=/run/secrets/mongo_admin_password
      - MONGO_INITDB_USERNAME_FILE=/run/secrets/mongo_user
      - MONGO_INITDB_PASSWORD_FILE=/run/secrets/mongo_password
      - MONGO_INITDB_DATABASE=admin
    secrets:
      - mongo_admin_password
      - mongo_admin_user
      - mongo_password
      - mongo_user
volumes:
  data-volume:
secrets:
  mongo_admin_user:
          file: ./secrets/mongo_admin_user
  mongo_admin_password:
          file: ./secrets/mongo_admin_password
  mongo_user:
          file: ./secrets/mongo_user
  mongo_password:
          file: ./secrets/mongo_password

And the init-mongo.sh is as follows:

mongo -- "$MONGO_INITDB_DATABASE" <<EOF
    var rootUser = '$(cat "$MONGO_INITDB_ROOT_USERNAME_FILE")';
    var rootPassword = '$(cat "$MONGO_INITDB_ROOT_PASSWORD_FILE")';
    db.auth(rootUser, rootPassword);
    db = db.getSiblingDB(<database_name>);

    var user = '$(cat "$MONGO_INITDB_USERNAME_FILE")';
    var passwd = '$(cat "$MONGO_INITDB_PASSWORD_FILE")';
    db.createUser({user: user, pwd: passwd, roles: 'readWrite'});
EOF
Markus W Mahlberg
  • 19,711
  • 6
  • 65
  • 89
hexterisk
  • 21
  • 1
  • Hey and welcome to SO! You wrote a nice first question, imho. You might want to add the `authSource` URI parameter (or use [SetAuth](https://godoc.org/go.mongodb.org/mongo-driver/mongo/options#ClientOptions.SetAuth) to pass [Credentials](https://godoc.org/go.mongodb.org/mongo-driver/mongo/options#Credential) with `AuthSource` set accordingly). If we set it explicitly, we ensure that this does not cause any of the problems. Since your root user usually is created in the `admin` database any according to your init script, your "standard" user is created in ``. – Markus W Mahlberg Nov 21 '19 at 07:48
  • https://stackoverflow.com/a/67029598/304371 – Artur A Apr 10 '21 at 00:08

0 Answers0