【问题标题】:authenticate user to mongo db on docker在 docker 上向 mongo db 验证用户身份
【发布时间】:2020-05-07 14:01:11
【问题描述】:

我正在尝试在我现有的项目中使用 docker。我有两个额外的服务,redis 和 mongodb。我在创建用户和验证该用户以能够使用数据库时遇到问题。我不想通过运行容器(docker exec -it ...)并创建用户并在那里授予权限来做到这一点。这样每个开发人员都必须在他们的机器上进行。相反,我希望在创建 mongodb 图像时运行脚本。

这是我的尝试

const {
  DATABASE_HOST,
  DATABASE_PORT,
  DATABASE_DBNAME,
  DATABASE_DBUSER,
  DATABASE_DBPASS,
} = require('../configs');

console.log('DATABASE', DATABASE_HOST);

db.createUser({
  user: DATABASE_DBUSER,
  pwd: DATABASE_DBPASS,
  roles: [
    {
      role: 'readWrite',
      db: DATABASE_DBNAME,
    },
  ],
});

docker-compose.yml

version: "3.7"

# Lets define all our services (i.e. our containers to run)
services:
    # create a mongodb database
    travel-db:
        image: mongo
        container_name: "travel-db"
        env_file:
            - ./.env
        volumes:
            - ./src/helpers/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
            - "mongodb:/data/db/"
        # opening mongodb port so that it can be connected from host
        ports:
            - "27017:27017"
    # create redis-server
    travel-redis-server:
        image: redis:latest
        container_name: "travel-redis-server"
        env_file:
            - ./.env
        volumes:
            - redis:/data/
        ports:
            - "6379:6379"

    # express app
    travel-express-server:
        image: "travel-express-server"
        container_name: "travel-express-server"
        env_file:
            - ./.env
        volumes:
            - .:/usr/src/app
        ports:
            - "8000:8000"

volumes:
    mongodb: {}
    redis: {}

我收到以下错误

更新

我把 mongo-init.js 改成了

db.createUser({
  user: 'traveluser',
  pwd: 'travel123',
  roles: [
    {
      role: 'readWrite',
      db: 'travel_db',
    },
  ],
});

然后它会说以下内容

Successfully added user: {
travel-db                |   "user" : "traveluser",
travel-db                |   "roles" : [
travel-db                |           {
travel-db                |                   "role" : "readWrite",
travel-db                |                   "db" : "travel_db"
travel-db                |           }
travel-db                |   ]
travel-db                | }

但身份验证仍然出错

SASL SCRAM-SHA-1 authentication failed for traveluser on travel_db from client 172.20.0.4:36562 ; UserNotFound: Could not find user "traveluser" for db "travel_db"

如果我使用

environment:
   - MONGO_INITDB_ROOT_USERNAME=admin
   - MONGO_INITDB_ROOT_PASSWORD=pass

然后评论以下 - ./src/helpers/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro 并使用管理员访问权限更改 env 变量然后它可以工作,但不是管理员。

【问题讨论】:

  • 您没有指定在哪个数据库中创建用户,所以它可能是在 admin 数据库中创建的。尝试使用admin 作为身份验证数据库。
  • 你的意思是说在创建用户时要包含use admin
  • 这是默认设置。我的意思是当您尝试连接时,将authSource=admin 添加到您的连接字符串,或使用--authenticationDatabase admin 选项,或任何适合您正在使用的驱动程序的函数。
  • 确认一下,你的意思是说这个让dbUrl = mongodb://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_DBNAME}?authSource=${DATABASE_DBNAME}; ?
  • 它适用于管理员案例,但不适用于其他用户。

标签: node.js mongodb docker


【解决方案1】:

require 不是 mongo shell 中的函数。如果您需要从文件中读取 javascript 代码,请使用 load 函数。

用户可能是在错误的数据库中创建的。您可以在创建时明确指定哪个数据库:

db.getSiblingDB("travel_db").createUser({
  user: 'traveluser',
  pwd: 'travel123',
  roles: [
    {
      role: 'readWrite',
      db: 'travel_db',
    },
  ],
})

【讨论】:

  • 感谢您的回答。可以举个例子吗?
  • 删除需要并硬编码 db setup 的值也不起作用。
  • 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 2014-12-20
  • 1970-01-01
  • 2020-08-15
  • 2017-10-05
相关资源
最近更新 更多