MongoDB学习(二)MongoDB 认证详解

1.启动MongoDB


1.1命令启动

root@wiki:[/root] mongod --config /opt/mongodb/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 24313
child process started successfully, parent exiting
root@wiki:[/root]

1.2系统启动

  1)设置mongodb.service启动服务
    cd /lib/systemd/system  
   
 vi mongodb.service  
    [Unit]  
    Description=mongodb  
    After=network.target remote-fs.target nss-lookup.target  
    [Service]  
    Type=forking  
    ExecStart=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb.conf  
    ExecReload=/bin/kill -s HUP $MAINPID  
    ExecStop=/usr/local/mongodb/bin/mongod --shutdown --config /usr/local/mongodb/bin/mongodb.conf  
    PrivateTmp=true  
    [Install]  
    WantedBy=multi-user.target  

2)mongodb.service服务
设置mongodb.service权限
chmod 754 mongodb.service
3) 系统mongodb.service操作命令
    #启动服务  
    systemctl start mongodb.service  
    #关闭服务  
    systemctl stop mongodb.service  
    #开机启动  
    systemctl enable mongodb.service 

1.2关闭mongodb

   方法一:

> use admin

>db.shutdownServer()

方法二: KILL

2.MongoDB连接

 

2.1常用命令

命令

介绍

show dbs

显示数据库列表

use mytest

切换/创建mytest数据库(如不存在则在第一次保存数据时创建自动创建)

db

当前使用的数据库名称

show collections

当前数据库下的所有集合列表(集合可以理解为以往的表)

db.users.insert()

向当前数据库users集合下插入一条数据,db为固定操作符,表示当前数据;users若不存在则自动创建

db.users.save()

功能同insert方法,区别在于:

①    如果原来对象存在,save会更新原对象,而insert会忽略操作(即不做任何操作)

②    Insert可以一次性插入一个列表,而不用遍历,效率高;save需要遍历插入

db.users.remove()

删除users集合中的一条数据,参数为主键

db.users.update()

修改users集合中的一条数据,第一个参数为主键,第二个是要修改的属性值

db.users.find()

查询users集合中的所有数据列表

 

2.1.1常用命令


命令

参考释义

help

显示基本操作命令

db.help()

显示数据库操作命令

db.collection.help()

显示集合操作命令

sh.help()

显示数据库分片操作命令

rs.help()

显示副本集操作命令

help admin

显示管理员操作命令

help connect

显示连接数据库命令

help keys

显示快捷键

help misc

显示其他该知道的东西

show dbs

显示所有数据库列表

show collections

显示当前数据库所有集合列表

show users

显示所有用户列表

show logs

显示所有日志名称列表(默认为global)

use dbname

切换/创建数据库(若不存在则自动创建)



2.1.2数据库相关


命令

参考释义

db.cloneCollection()

在MongoDB实例之间复制集合数据

db.cloneDatabase()

从指定主机上克隆数据库到当前数据库

db.commandHelp()

返回数据库命令的帮助信息

db.copyDatabase()

从指定的主机上复制指定数据库数据到某个数据库

db.createCollection()

创建一个新的集合

db.currentOp()

显示当前正在进行的操作。

db.dropDatabase()

删除当前数据库。

db.fsyncLock()

刷新写入磁盘并锁定该数据库,以防止写入操作,并协助备份操作。

db.fsyncUnlock()

允许继续进行写入锁住的数据库(解锁)

db.getCollection()

返回一个集合对象。需要传递一个在数据库中存在的一个有效的集合名称

db.getCollectionInfos()

返回当前数据库中的所有集合信息。

db.getCollectionNames()

列出当前数据库中的所有集合。

db.getLastError()

检查并返回最后一个操作的状态。

db.getLastErrorObj()

返回上次操作状态的文件。

db.getLogComponents()

返回日志消息详细级别。

db.getMongo()

返回MongoDB当前连接的连接对象。

db.getName()

返回当前数据库的名称。(也可以直接使用db;命令)

db.getPrevError()

返回包含自上次错误复位所有的错误状态文件。

db.hostInfo()

返回当前数据库主机系统的相关信息

db.killOp()

终止指定的操作。

db.listCommands()

显示公共数据库的命令列表。

db.logout()

注销登录

db.repairDatabase()

修复当前数据库

db.resetError()

重置db.getPrevError()和getPrevError返回的错误信息。

db.runCommand()

运行一个数据库命令。

db.serverStatus()

返回当前数据库状态的概要

db.setLogLevel()

设置一个单独的日志信息级别。

db.setProfilingLevel()

修改当前数据库的分析级别。

db.shutdownServer()

关闭当前数据库运行实例或安全停止有关操作进程

db.stats()

返回在当前数据库的状态报告。

db.version()

返回当前数据库的版本信息


2.1.3集合相关


命令

参考释义

db.collection.bulkWrite()

批量写入

db.collection.count()

返回集合总数或匹配查询的结果集总数

db.collection.copyTo()

已过时。现此操作被封装在两个数据库实例之间的复制数据中

db.collection.createIndex()

创建一个集合索引

db.collection.dataSize()

返回集合的大小

db.collection.deleteOne()

删除集合中的一个文档

db.collection.deleteMany()

删除集合中的多个文档。

db.collection.distinct()

返回具有指定字段不同值的文档(去除指定字段的重复数据)

db.collection.drop()

删除当前数据库中的collection集合

db.collection.dropIndex()

删除一个集合中的指定索引

db.collection.dropIndexes()

删除一个集合中的所有索引

db.collection.ensureIndex()

已过时。现使用db.collection.createIndex() 。

db.collection.explain()

返回各种方法的查询执行信息

db.collection.find()

查询集合,无参数则查询所有,并返回一个游标对象。

db.collection.findAndModify()

查询并修改

db.collection.findOne()

查询单条数据

db.collection.findOneAndDelete()

查询单条数据并删除

db.collection.findOneAndReplace()

查询单条数据并替换

db.collection.findOneAndUpdate()

查询单条数据并更新

db.collection.getIndexes()

返回当前集合的所有索引数组

db.collection.group()

提供简单的数据聚合功能

db.collection.insert()

在当前集合插入一条或多条数据(或叫文档)

db.collection.insertOne()

在当前集合插入一条数据

db.collection.insertMany()

在当前集合插入多条数据

db.collection.isCapped()

判断集合是否为定容量

db.collection.reIndex()

重建当前集合的所有索引

db.collection.replaceOne()

替换集合中的一个文档(一条数据)

db.collection.remove()

从当前集合删除数据

db.collection.renameCollection()

重命名集合名称

db.collection.save()

在当前集合插入一条数据,同insert()方法的区别:

当要插入的数据已存在时,save会执行更新操作,而insert方法会忽略当前操作

db.collection.stats()

返回当前集合的状态

db.collection.storageSize()

返回当前集合已使用的空间大小

db.collection.totalSize()

返回当前集合的总占用空间,包括所有文件和所有索引

db.collection.totalIndexSize()

返回当前集合所有的索引所占用的空间大小

db.collection.update()

修改集合中的数据。

db.collection.updateOne()

修改集合中的一条数据。

db.collection.updateMany()

修改集合中的多条数据。

db.collection.validate()

执行对集合验证操作。

2.2 MONGODB登录


注:MONGODB没有启用授权认证,可以直接登录

输入mongo命令默认连接到本地的名称为test的数据库,默认端口:27017

mongo

连接到远程数据库,可以使用mongo ip:port

mongo -u username -p password –hosthostname –port 28015

查看当前正在使用的数据库,默认情况下使用test数据库


root@wiki:[/root]mongo
MongoDB shell version v3.6.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.2
Server has startup warnings:
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten]
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten]
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten] ** WARNING: This server is bound to localhost.
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten] **          Remote systems will be unable to connect to this server.
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten] **          Start the server with --bind_ip <address> to specify which IP
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten] **          addresses it should serve responses from, or with --bind_ip_all to
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten] **          bind to all interfaces. If this behavior is desired, start the
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten] **          server with --bind_ip 127.0.0.1 to disable this warning.
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten]
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten]
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten]
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-06-06T14:58:29.501+0800 I CONTROL  [initandlisten]
>
> show dbs;
2018test  0.000GB
admin     0.000GB
config    0.000GB
fadk      0.000GB
fang      0.311GB
local     0.000GB
test      0.000GB
> show collections;
system.profile
> help
    db.help()                    help on db methods
    db.mycoll.help()             help on collection methods
    sh.help()                    sharding helpers
    rs.help()                    replica set helpers
    help admin                   administrative help
    help connect                 connecting to a db help
    help keys                    key shortcuts
    help misc                    misc things to know
    help mr                      mapreduce

    show dbs                     show database names
    show collections             show collections in current database
    show users                   show users in current database
    show profile                 show most recent system.profile entries with time >= 1ms
    show logs                    show the accessible logger names
    show log [name]              prints out the last segment of log in memory, 'global' is default
    use <db_name>                set current database
    db.foo.find()                list objects in collection foo
    db.foo.find( { a : 1 } )     list objects in foo where a == 1
    it                           result of the last line evaluated; use to further iterate
    DBQuery.shellBatchSize = x   set default number of items to display on shell
    exit                         quit the mongo shell
>




2.3.MongoDB单机认证登录

注意一点,帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth)

1)mongodb安装好后第一次进入是不需要密码的,也没有任何用户,通过shell命令可直接进入.

2)添加管理用户(mongoDB 没有无敌用户root,只有能管理用户的用户userAdminAnyDatabase),

>use admin

>db.createUser( {user:"admin",pwd: "123456",roles: [ { role:"userAdminAnyDatabase", db: "admin" } ]})

注:添加完用户后可以使用show users或db.system.users.find()查看已有用户

3)添加完管理用户后,关闭MongoDB,并使用权限方式再次开启MongoDB,这里注意不要使用kill直接去杀掉mongodb进程,(如果这样做了,请去data/db目录下删除mongo.lock文件),可以使用db.shutdownServer()关闭

4)使用权限方式启动MongoDB

./mongod--dbpath=/usr/local/server/mongodb/data--logpath=/usr/local/server/mongodb/mongod.log --fork --auth

或者在配置文件中修改:

 auth= true

#noauth = true

5)进入mongo shell,使用admin数据库并进行验证,如果不验证,是做不了任何操作的。

> use admin

>db.auth("admin","123456")  #认证,返回1表示成功

6)验证之后还是做不了操作,因为admin只有用户管理权限,下面创建用户,用户都跟着库走,

> use mydb

> db.createUser({user:"root",pwd: "123456",roles: [{ role: "readWrite",db: "mydb" }]})

7)使用创建的用户root登录进行数据库操作:

[root@localhost mongodb]# mongo127.0.0.1/mydb -uroot -p

connecting to: 127.0.0.1/mydb

> db

mydb

> use mydb

switched to db mydb

> show collections

然后就可以进行增删改查各种数据操作...

2.4.MongoDB集群认证登录

2.4.1  mongodb集群及配置安全认证

: Mongodb安全认证在单实例和副本集两种情况下不太一样,单实例相对简单,只要在启动时加上 --auth参数即可,但副本集则需要keyfile

mongodb集群的权限管理分为两部分,一部分是最常用的Role-Based Access Control,也就是用户名密码方式,这种验证方式一般出现在单机系统,或者集群中client端连接Mongos端;另一种是Internal Authentication.有英文基础想获取security完整信息的请点击访问官方文档。

1)        Role-Based Access Control

  官方文档上介绍如下:MongoDB采用基于角色的访问控制(RBAC)来管理对MongoDB系统的访问。授予用户一个或多个角色,以确定用户对数据库资源和操作的访问。在角色分配之外,用户无法访问系统。(不得不说。。google翻译做的不错,这一段翻出来竟然毫无违和感)。

  RBAC通过角色来赋予用户权限,在开启权限管理之前,个人建议先创建几个用户,至少要有一个拥有用户管理权限的角色存在。在mongodb中,系统自带了若干角色:

    库使用权限:read,readWrite

  库管理权限:dbAdmin, dbOwner, userAdmin

  集群管理权限:clusterAdmin, clusterManager, clusterMonitor, hostManager

  备份恢复权限:backup, restore

  全局权限:readAnyDatabase, readWriteAnyDatabase, userAdminAnyDatabase,dbAdminAnyDatabase

  超级用户:root,__system(包含所有权限官方不建议使用)

  对于使用来讲,建议首先创建一个包含全局权限的用户(dbAdmin并不能readwrite),这样在启用权限管理之后便可以通过这个用户来创建其他用户。Mongodb权限管理默认是精确到DB的,如果需要区分一个DB下的不同collection的权限需要自定义role。对用户赋予库使用和库管理权限的时候需要指定库,这样用户会获得此库下的对应权限。对mongodb来讲,在哪个库下创建的用户,就需要每次在创建的库进行认证。所以建议在创建用户的时候,库使用用户和库管理用户在指定库下创建用户。

2)        Internal Authentication

  这个东西是用来在集群中进行互相认证的,每个Mongo实例在互相访问的过程中会验证彼此的权限,只有满足条件才可以进行数据读写等操作。分为两种方式,一种是Keyfiles,一种是x.509,在普通集群中Keyfiles已经足够了,而且相对比较简单,只需要在每个节点启动的时候指定相同的Keyfile就行。x.509提供了一个SSL/TLS连接,并不常用。

 

2.4.2     权限认证

mongodb存储所有的用户信息在admin数据库的集合system.users中,保存用户名、密码和数据库信息mongodb默认不启用权限认证,只要能连接到该服务器,就可连接到mongod。若要启用安全认证,需要更改配置文件参数authorization,也可以简写为auth。然后,重启mongod。查看日志文件,发现权限认证已经开启;

2.4.3      角色管理

MongoDB内建角色包括以下几类

1)    数据库用户角色

read:允许用户读取指定数据库

readWrite:允许用户读写指定数据库

2)    数据库管理员角色

dbAdmin:允许用户进行索引创建、删除,查看统计或访问system.profile,但没有角色和用户管理的权限

userAdmin:提供了在当前数据库中创建和修改角色和用户的能力

dbOwner提供对数据库执行任何管理操作的能力。这个角色组合了readWritedbAdminuserAdmin角色授予的特权。

3)    集群管理角色

clusterAdmin 提供最强大的集群管理访问。组合clusterManagerclusterMonitorhostManager角色的能力。还提供了dropDatabase操作

clusterManager 在集群上提供管理和监视操作。可以访问配置和本地数据库,这些数据库分别用于分片和复制

clusterMonitor 提供对监控工具的只读访问,例如MongoDB云管理器和Ops管理器监控代理。

hostManager 提供监视和管理服务器的能力。

4)    备份恢复角色

backup 提供备份数据所需的能力,使用MongoDB云管理器备份代理、Ops管理器备份代理或使用mongodump

restore 提供使用mongorestore恢复数据所需的能力

5)    所有数据库角色

readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限

readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限

userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限

dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。

6)    超级用户角色

root:提供对readWriteAnyDatabasedbAdminAnyDatabaseuserAdminAnyDatabaseclusterAdminrestorebackup的所有资源的访问

7)    内部角色

__system : 提供对数据库中任何对象的任何操作的特权

2.4.4   副本集+分片环境下的认证

需要注意以下几点:

1)        在分片集群环境中,副本集内成员之间需要用keyFile认证,mongos与配置服务器,副本集之间也要keyFile认证,集群所有mongod和mongos实例使用内容相同的keyFile文件。

2)        进行初始化,修改副本集时,都从本地例外登录进行操作

3)        由于启用了认证,需要建立一个管理员帐号,才能从远程登录。建立管理员帐户,利用管理员账户从远程登录后,需要建立一个可以操作某个数据库的用户,客户端就用这个用户访问数据库。

4)        分片集群中的管理员帐号需要具备配置服务器中admin和config数据库的读写权限,才能进行分片相关操作;

5)        集群中每个分片有自己的admin数据库,存储了集群的各自的证书和访问权限。

副本集总体思路是用户名、密码和keyfile文件,keyfile需要各个副本集服务启动时加载而且要是同一文件,然后在操作库是需要用户名、密码

KeyFile文件必须满足条件:

1)至少6个字符,小于1024字节

2)认证时候不考虑文件中空白字符

3)连接到副本集的成员和mongos进成的keyfile文件内容必须一样

4)必须是base64编码,但是不能有等号

5)文件权限必须是x00,也就是说,不能分配任何权限给group成员和other成员

  

2.4.5      生成密钥文件

openssl rand-base64 64 > /home/ keyfile.dat

或者

openssl rand -base64 741> /home/mongodb-keyfile

           生成64字节的密钥文件

或者 openssl rand -base64 100 >/mongodb/scheme2/keyfile0 --文件内容采base64编码,一共100个字符

   chmod 600 keyfile.dat 

           建议把密钥文件的权限设置为600(针对启动mongo实例的那个用户) 

接着需要把这个密钥文件拷贝到集群中每一个结点上(路由结点,元配置结点,分片结点上都要有这个密钥文件);

注:开启了keyFile,隐含就开启了auth,连接副本集就需要进行认证了,否则只能通过本地例外方式操作数据库。

在副本集中添加用户需要在服务未加--keyFile参数启动的情况加按照单实例方法添加(访问任意一个副本器操作,其他副本集会自动同步),账户添加、授权成功后重新加入keyFile启动服务,即可完成并使用。

 

把生成的密钥文件拷贝到集群中每一个结点上:

cp/home/keyfile   /data/config/data/ 

 cp /home/keyfile   /data/mongos/

 cp /home/keyfile  /data/shard1/data/

 cp /home/keyfile  /data/shard2/data/

 cp /home/keyfile  /data/shard3/data/

 cp /home/keyfile  /data/shard4/data/

 cp /home/keyfile  /data/shard5/data/

find  /data/ -name keyfile

然后通过scp的方式把这个文件分别拷贝到所有的节点上对应目录中

 cp /home/keyfile  IP:/data/config/data/

 cp /home/keyfile  IP:/data/mongos/

 cp /home/keyfile  IP:/data/shard1/data/

 cp /home/keyfile  IP:/data/shard2/data/

 cp /home/keyfile  IP:/data/shard3/data/

 cp /home/keyfile  IP:/data/shard4/data/

 cp /home/keyfile  V/data/shard5/data/

 

  find /data/mongodb -name keyfile

2.4.6      创建集群用户

   MongoDB没有默认管理员账号,所以要先添加管理员账号。切换到admin数据库,添加的账号才是管理员账号首先登录单机Mongod或者集群的mongos创建一个有权限的用户;

1、登陆mongos添加集群用户

db.createUser({

... user: "root",

... pwd: "root",

... roles: [

... {role: "clusterAdmin", db:"admin"},

... {role:"readWriteAnyDatabase", db: "admin"},

... {role:"userAdminAnyDatabase", db: "admin"},

... {role: "dbAdminAnyDatabase",db: "admin"}]

... })

或者

 db.createUser({

 user: "superman",

 pwd: "superman",

 roles: ["clusterAdmin","userAdminAnyDatabase","dbAdminAnyDatabase","readWriteAnyDatabase"] } )

 

db.createUser({

user:"lixiaomeng"

,pwd:"11111",

roles:[{role:"root",db:"admin"}]});

 

db.createUser({

user:"dbapp"

pwd:"dbapp",

roles:[{role:"dbAdminAnyDatabase",db:"admin"}]})

 

db.createUser({

... user:"gaoze",

... pwd:"gaolaoban",

... roles: [

... {role:"clusterAdmin", db: "admin"},

... {role:"readWriteAnyDatabase", db: "admin"},

... {role:"userAdminAnyDatabase", db: "admin"},

... {role:"dbAdminAnyDatabase", db: "admin"}]

... })

 

--创建应用用户

 use point

db.createUser(

{

user:"point",

pwd:"point",

roles: [

{ role:"read", db: "point" },

{ role:"readWrite", db: "point" }

]

}

)

 

创建只读写用户

db.createUser({

user:"rw",  

 pwd: "1",   

roles: [{role:"readWrite", db: "test"}]})

创建只读用户

db.createUser({

user:"read",   

pwd:"read",   

roles: [{role:"read", db: "point"}]})

示例创建一个管理员,直接给几个所有数据库权限即可:
db.createUser({
user:"test",
pwd:"test.com",
roles:
[ {
    role:"userAdminAnyDatabase",
    db:"admin"
  },
  {
    role:"readWriteAnyDatabase",
    db:"admin"
  },
  {
    role:"dbAdminAnyDatabase",
    db:"admin"
  }
]})
 
 
示例创建某个用户对数据库只赋予只读权限:
db.createUser({
user:"test",
pwd:"test.com",
roles:
[ 
  {
    role:"read",
    db:"test"
  }
]
 
db.auth("root","123456"--进行用户验证后,发现能够使用后面的命令了

 

创建用户并验证

> use admin
> show collections   --当我们查看集合的时候提示没有权限
system.indexes
system.users
system.version
> db.system.users.find()

查询实例中所有的用户信息

>use admin
>db.system.users.find().pretty()          ---将所有用户信息查询出来
 
>db.getUser("mintq")查看用户有什么权限;

db.auth('test1','test1')认证用户;

 

 

2.4.7    加入认证的配置

注:生成keyfile(每个进程的key file都保持一致)

加入认证的配置有两种:

第一种添加认证到配置文件里面

1)        vi/usr/local/mongodb/conf/config.conf

添加配置参数\安全认证

#security:

   authorization: enabled

   keyFile:"/data/config/data/keyfile"

 

2)        vi/usr/local/mongodb/conf/shard1.conf

添加配置参数\安全认证

#security:

   authorization: enabled

   keyFile:"/data/shard5/data/keyfile"

 

3)        vi/usr/local/mongodb/conf/mongos.conf

添加配置参数\安全认证

#security:

   authorization: enabled

   keyFile: "/data/mongos/keyfile"

或者

#security:

"security":

{

   "authorization":"enabled",

   "clusterAuthMode":"keyFile",

   "keyFile":"/data/config/data/keyfile"

}

第二种启动里指定KEY文件位置

配置:mongod --config/usr/local/mongodb-3.6.2/conf/config.conf --keyFile /data/config/data/keyfile

分片:mongod --config/usr/local/mongodb-3.6.2/conf/shard1.conf --keyFile /data/shard1/data/keyfile

路由:mongos --config/usr/local/mongodb-3.6.2/conf/mongos.conf --keyFile /data/mongos/keyfile

2.4.8      开启集群认证

   keyFile  在每个结点(路由结点,元配置结点,分片结点)的配置文件中加入keyFile的配置项auth=true; 

           在每个元配置结点和分片结点(即除了mongos结点)的配置文件中加入auth=true的配置项 

   

           关闭原先的集群:db.shutdownServer()   

           注意,需要按照路由结点 -> 配置结点 -> 分片结点的顺序,依次关闭各结点的进程 

           在关闭某个进程时,需要先进入admin库,然后执行这条命令 

killall mongos &&killall mongod

或者

db.shutdownServer()

或者

 

使用命令行方式关闭

 mongod -f /etc/mongo-m.conf  --shutdown

 

重新启动集群

配置:mongod --config/usr/local/mongodb-3.6.2/conf/config.conf --keyFile /data/config/data/keyfile

分片:mongod --config/usr/local/mongodb-3.6.2/conf/shard1.conf --keyFile /data/shard1/data/keyfile

路由:mongos --config/usr/local/mongodb-3.6.2/conf/mongos.conf --keyFile /data/mongos/keyfile

 

2.4.9      验证集群的认证

   mongo 127.0.0.1:27017/admin 

           进入路由结点(地址和端口请按照你的实际情况)    

   db.auth(yourusername,yourpassword)   

           admin库的认证   

   use 新库   

           进入之前你创建的新库  

   db.新表.insert({...})   

           往这个新库的新表里插入一条数据 

           发现报错没有权限,因为你需要进行auth,先执行db.auth(yourusr,yourpwd) 

           然后再执行这条命令 

   

   db.新表名.ensureIndex({...}) 

           为这个新表添加索引 

   db.runCommand({ shardcollection : "库名.表名", key: {...} }) 

           为这个新表添加片键。注意,强烈推荐片键是索引的一部分前缀,这样能够达到查询的局部化 

           注意,要先进入admin库,否则这条命令不会成功 

   db.表名.stats() 

           查看该库中的该表的集群状态 

           若发现里面最开始的sharded字段是true,则表示添加认证功能后的集群没有出现异常 

   db.printShardingStatus() 

           查看分片状态

注:需要认证,没有认证没有任何权限

 

没有认证的帐号

root@node:/root#mongo 192.168.1.217:20000

mongos> db

test

mongos> show collections;

2018-04-09T16:31:17.604+0800 E QUERY    [thread1] Error: listCollections failed: {

         "ok": 0,

         "errmsg" : "not authorized on test to executecommand { listCollections: 1.0, filter: {}, 

 

mongos> use admin

switched to db admin

mongos> show collections;

2018-04-09T16:31:26.158+0800 E QUERY    [thread1] Error: listCollections failed: {

         "ok": 0,

         "errmsg": "not authorized on admin to execute command { listCollections: 1.0,filter: {},

 

账户认证后状态

#admin库认证

mongo 192.168.1.217:20000/admin -u gaoze -pgaolaoban

mongos> show collections;

system.indexes

system.users

system.version

#uba库认证 读写权限用户

[root@master ~]# mongo localhost:20000/uba-u sa -p 123root

mongos> show collections;

system.indexes

table1

mongos> db.table1.count()

0

mongos> for (var i = 1; i <= 1000;i++)db.table1.save({id:i,name:"username"+i,age:i});

WriteResult({ "nInserted" : 1 })

mongos> db.table1.count()

1000

mongos> db.table1.findOne()

{

   "_id" : ObjectId("53ddb52a65bb900f61e458a1"),

   "id" : 1,

   "name" : "username1",

   "age" : 1

}

mongos> db.auth('sa','123root')

1

 

#uba库 只读权限用户

[root@master ~]# mongo localhost:20000/uba-u sa_read -p 123root_read

mongos>db.auth('sa_read','123root_read')

1

mongos> db

uba

mongos> for (var i = 1; i <= 1000;i++)db.table1.save({id:i,name:"username"+i,age:i});

WriteResult({

   "writeError" : {

        "code" : 13,

       "errmsg" : "not authorized on uba to execute command {insert: \"table1\", documents: [ { id: 1000.0, name:\"username1000\", age: 1000.0, _id: ObjectId('53ddb5d62390d9a487087c87')} ], ordered: true }"

    }

})

mongos> db.table1.findOne()

{

   "_id" : ObjectId("53ddb52a65bb900f61e458a1"),

   "id" : 1,

   "name" : "username1",

   "age" : 1

}

mongos> db.table1.count()

1000

 

 






  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值