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