阿里云ECS服务器环境搭建(5) —— ubuntu 16.04 下为mongodb各个数据库设置用户名和密码

阿里云ECS服务器环境搭建(5) —— ubuntu 16.04 下为mongodb各个数据库设置用户名和密码

1. 环境

  • 阿里云 ECS服务器 (4核 8G 4M)
  • Ubuntu16.04-64-bit 图形界面
  • MongoDB v3.6.5

2. 前提须知

  • 开启mongodb服务的命令:service mongod start
  • 关闭mongodb服务的命令:service mongod stop
  • mongodb的配置文件位置在: /etc/mongod.conf
  • MongoDB在默认情况下是没有认证权限的,因为/etc/mongod.conf 中,默认auth = false
  • mongodb的用户名和密码是基于特定数据库的,而不是基于整个系统的。一般来说所有的数据库db都需要设置用户名和密码,独立认证的。
  • 要想使设置的用户名和密码有效,需要修改MongoDB的配置文件,将 /etc/mongod.conf 文件中的 auth=true 前面的注释去掉。

3. mongodb用户设置规则

3.1. 语法规则

db.createUser(  
{ user: "",  
  pwd: "",  
  customData: {  },  
  roles: [  
    { role: "", db: "" } | "",  
    ...  
  ]}  
)  

# 栗子
use admin  
db.createUser({user:'useradmin',pwd:'123456',customData:{"desc":"This user is for administrators"},  
roles:[{role:'userAdminAnyDatabase',db:'admin'}]})  
  • 参数说明:
    • user:用户名
    • pwd:密码
    • customData:用于描述账户信息
    • roles:指定用户的角色,可以用一个空数组给新用户设定空角色;在roles字段,可以指定内置角色和用户定义的角色。role里的角色可以选择如下,参考3.2

3.2. mongodb角色roles详解

  • mongodb内置角色:
    • 数据库用户角色(Database User Roles):read、readWrite
      Read:允许用户读取指定数据库
      readWrite:允许用户读写指定数据库
    • 数据库管理角色(Database Administration Roles):dbAdmin、dbOwner、userAdmin
      dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
      dbOwner:允许用户在当前数据库中执行任意操作。
      userAdmin:允许用户在当前DB中管理User,向system.users集合写入,可以在指定数据库里创建、删除和管理用户
    • 集群管理角色(Cluster Administration Roles):clusterAdmin、clusterManager、clusterMonitor、hostManager
      clusterAdmin:只在admin数据库中可用,授予管理集群的最高权限,用户所有分片和复制集相关函数的管理权限。
      clusterManager:授予管理和监控集群的权限,A user with this role can access the config and local databases, which are used in sharding and replication, respectively.
      clusterMonitor:授予监控集群的权限,对监控工具具有readonly的权限
      hostManager:管理Server
    • 备份恢复角色(Backup and Restoration Roles):backup、restore
      backup, retore:在进行备份、恢复时可以单独指定的角色,在db.createUser()方法中roles里面的db必须写成是admin库,要不然会报错。
    • 跨数据库角色(All-Database Roles):readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
      readAnyDatabase:只在admin数据库中可用,授予用户在所有数据库上读取数据的权限。
      readWriteAnyDatabase:只在admin数据库中可用,授予用户在所有数据库上读写数据的权限。
      userAdminAnyDatabase:只在admin数据库中可用,授予用户在所有数据库的userAdmin权限。
      dbAdminAnyDatabase:只在admin数据库中可用,授予用户在所有数据库的dbAdmin权限。
    • 超级用户角色:root
      root:只在admin数据库中可用。超级账号,超级权限。可以访问所有的数据库~
      # 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase
    • 内部角色:__system

4. 设置超级管理员用户 root

  • 第一步:先关闭配置文件中的认证设置,来设置好用户名和密码,以免无法进入mongodb shell
gedit /etc/mongod.conf

阿里云ECS服务器环境搭建(5) —— ubuntu 16.04 下为mongodb各个数据库设置用户名和密码_第1张图片

  • 第二步:进入mongodb shell,设置admin数据库下的超级管理员用户,可以通过认证这个帐号访问到所有其他的数据库。
# 开启mongodb 服务
service mongodb start

# 进入mongo shell
mongo

# 在数据库admin下,创建超级管理员用户
use admin
db.createUser({user:"testde", pwd:"test333", roles:["root"]})
# 或者:db.createUser({user:'testde',pwd:'test333', roles:[{role:'root', db:'admin'}]})

# 退出 mongo shell
exit

阿里云ECS服务器环境搭建(5) —— ubuntu 16.04 下为mongodb各个数据库设置用户名和密码_第2张图片

  • 此时,可以看到admin数据库中,已经有这个用户的所有信息了。
    阿里云ECS服务器环境搭建(5) —— ubuntu 16.04 下为mongodb各个数据库设置用户名和密码_第3张图片

  • 第三步:修改mongodb配置文件,开启认证。然后启动mongodb服务。

gedit /etc/mongod.conf
service mongodb start

阿里云ECS服务器环境搭建(5) —— ubuntu 16.04 下为mongodb各个数据库设置用户名和密码_第4张图片

  • 使用 NoSQLBooster进行连接(阿里云ECS服务器上):
    阿里云ECS服务器环境搭建(5) —— ubuntu 16.04 下为mongodb各个数据库设置用户名和密码_第5张图片

  • 在python中,可以通过如下方式进行访问:

import pymongo

# 阿里云服务器ECS mongodb地址
mongoUrl = "110.29.198.117:27017"
# 数据库
DATABASE = "testPro"
# 表名
COLLECTION = "testTable"

# 查询表 testPro.testTable 中的数据信息
if __name__ == "__main__":
    # 这个是ECS服务器上的mongodb,需要开启认证~
    # 建立和数据库系统的连接,创建Connection时,指定host及port参数
    mongodbClient = pymongo.MongoClient(mongoUrl)

    # admin 数据库有帐号,连接 - 认证-切换到其他数据库
    # 第一种方式,使用admin超级用户的权限
    # 使用 数据库admin中的超级用户进行认证...
    db_auth = mongodbClient.admin
    db_auth.authenticate('testde', '123456')

    # 认证完成之后,直接用这个认证状态访问其他普通数据库
    # 连接数据库
    db = mongodbClient[DATABASE]
    db_coll = db[COLLECTION]

    srcResult = db_coll.find({}).limit(10)
    for record in srcResult:
        print(f"record = {record}")
  • 但是有一点需要特别注意,从windows端连接到阿里云ECS服务端时,加入admin超级用户认证之后,NoSQLBooster中并不会显示其他的数据库数据,只是简单的连接上了,但是并不能显示所有的数据库。—— 解决的办法是,在连接的时候,选择clone,如下所示,可以对比两种方式的直接效果:
    阿里云ECS服务器环境搭建(5) —— ubuntu 16.04 下为mongodb各个数据库设置用户名和密码_第6张图片

5. 对普通数据库设置权限

  • 基本的流程可以参考上面第4节。核心步骤如下:
# 进入 mongo shell
mongo

# 使用超级用户认证,认证之后,才能操作数据库
use admin
db.auth("ancode", "123456")

# 切换到 testPro 这种普通的数据库
use testPro

# 为数据库 testPro创建用户名和密码
# 角色为 readWrite 和 dbOwner, 双重角色
db.createUser({user:"zhangsan",pwd:"123",roles:[{"readWrite",db:"testPro"},
{role:"dbOwner",db:"testPro"}]})

# 退出 mongo shell
exit

# 重启mongo服务
service mongodb stop
service mongodb start

阿里云ECS服务器环境搭建(5) —— ubuntu 16.04 下为mongodb各个数据库设置用户名和密码_第7张图片

  • 测试结果(windows端使用NoSQLBooster远程连接):
    阿里云ECS服务器环境搭建(5) —— ubuntu 16.04 下为mongodb各个数据库设置用户名和密码_第8张图片

  • 测试结果(python代码测试):

import pymongo

# 阿里云服务器ECS mongodb地址
mongoUrl = "110.29.198.117:27017"

# 数据库
DATABASE = "testPro"
# 表名
COLLECTION = "testTable"

# 查询表 testPro.testTable 中的数据信息
if __name__ == "__main__":
    # 这个是ECS服务器上的mongodb,需要开启认证~
    # 建立和数据库系统的连接,创建Connection时,指定host及port参数
    mongodbClient = pymongo.MongoClient(mongoUrl)

    # 第二种方式,直接使用对应数据库的账户和密码,操作对应的数据库
    # 直接在目标数据库上进行用户认证
    db_auth = mongodbClient.testPro
    db_auth.authenticate('zhangsan', '123')

    # 连接数据库
    db = mongodbClient[DATABASE]
    db_coll = db[COLLECTION]

    srcResult = db_coll.find({}).limit(10)
    for record in srcResult:
        print(f"record = {record}")

# 输出结果:
record = {'_id': '样本1', 'count': '10000'}

6. 特别说明:错误处理

  • 如下图所示,当我们在普通的数据库testPro上,创建一个角色为 role:”root” 的用户时,是会创建失败的! 提示的error是: E QUERY [thread1] Error: couldn’t add user: No role named root@testPro ,但是在第4节的时候,我们确实可以按这种方式在admin数据库中创建啊,这是怎么回事呢?
  • 原因在于: root角色只在admin数据库中可用,普通数据库中,无法创建这样的角色! 所以,明确每种角色的功能和使用范围特别重要,正确的方式参考第5节
    阿里云ECS服务器环境搭建(5) —— ubuntu 16.04 下为mongodb各个数据库设置用户名和密码_第9张图片

7. 参考

  • Nosql Mongodb 基本操作说明: https://blog.csdn.net/yown/article/details/51501273
  • MongoDB3.2 用户权限:https://blog.csdn.net/jianlong727/article/details/53889990
  • mongo 系统权限问题:https://blog.csdn.net/wll_1017/article/details/72461573

你可能感兴趣的:(阿里云服务器环境搭建)