欢迎投稿

今日深度:

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

阿里云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: "<name>",  
  pwd: "<cleartext password>",  
  customData: { <any information> },  
  roles: [  
    { role: "<role>", db: "<database>" } | "<role>",  
    ...  
  ]}  
)  

# 栗子
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

_

第二步:进入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

此时,可以看到admin数据库中,已经有这个用户的所有信息了。
_

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

gedit /etc/mongod.conf
service mongodb start

_

  • 使用 NoSQLBooster进行连接(和通数据库ECS服务器上):
    _
  • 在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,如下所示,可以对比两种方式的直接效果:
    _

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

_

  • 测试结果(windows端使用NoSQLBooster远程连接):

_

测试结果(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节。
_

www.htsjk.Com true http://www.htsjk.com/MongoDB/38395.html NewsArticle 阿里云ECS服务器环境搭建(5) —— ubuntu 16.04 下为mongodb各个数据库设置用户名和密码,阿里云服务器环境搭建 和通数据库ECS服务器环境搭建(5) —— ubuntu 16.04 下为mongodb各个数据库...
评论暂时关闭