权限管理,用户角色

2019-10-06 03:40 来源:未知

1.MongoDB权限介绍

  a 上篇文章中,我们在Linux下配置了MongoDB环境并且将其设置为服务随机器启动而启动,那么接下来这篇文章我们就来简单说一下MongoDB下对登录用户权限的管理。

  b  MongoDB安装完成后,默认是不需要输入用户名密码即可登录的,但是往往数据库方面我们会出于安全性的考虑而设置用户名密码,本篇文章主要介绍了MongoDB添加管理员/普通用户的方法。

  c 在我们使用的关系型数据库中,一般都是含有权限控制的,也就是说配置什么用户访问什么数据库,什么数据表,什么用户可以对表进行增删改,什么用户可以对表进行读取等等都是可以配置,那么MongoDB作为一个非关系型数据库的典型,它其实也是可以配置的,而掌握MongoDB的权限我们只需要简单理解下面几点,后面按照下面的几点去配置即可(网上学习所得到的总结)。

    c.1 MongoDB是没有默认管理员账号的,所以要先添加管理员账号,在开启权限认证。

    c.2 切换到admin数据库,添加的账号才是管理员的账号。

    c.3 用户只能在用户所在的数据库登录,包括管理员账号。

    c.4 管理员可以管理所有的数据库,但是不能直接管理其它数据库,要先在admin数据库中认证才可以,也是为了 安全性考虑。

  d 本学习笔记在linux下安装的MongoDB的版本是3.2.8,所以下面操作的命令都是以3.2.8版本为例,这是因为老版本和新版本的命令有所不同,请大伙周知,如果大家用的版本比较低,请自行查看命令是什么进行测试操作。

http://www.cnblogs.com/zhoujinyi/p/4610050.html

2 MongoDB添加管理员账户

  a 上面简单的说明之后,下面我们需要开始连接数据库进入CLI管理界面,只有进入此页面之后我们才能够对其进行操作(暂时为用客户端,后面会用客户端来进行说明)。

    a.1 首先跳转到MongoDB安装包下的bin文件夹下,然后使用命令(./mongo)启动,则会启动成功(确保MongoDB的服务已启动),如图所示(MongDB的安装路劲为自己的安装路径,可能会和我的不一致,请检查):

      图片 1

    a.2 如图所示,则连接成功,我们即可在>后面进行操作。

  b 连接数据库并且切换到用户表下

    b.1 连接成功之后首先我们输入命令:show dbs,我们发现其系统中内置了一个数据库名字为local(如果大家查询出来还有一个admin数据库,那是因为你使用的是低版本的MongoDB),admin库是不存在的,需要我们自己创建。

    b.2 (use admin) 使用此命令创建一个admin数据库,权限管理就要使用admin数据库,此命令也是切换数据库的命令。

    b.3 (show collections) 切换到admin库之后,使用show collections查询,我们发现该数据库下包含了一个system.user和system.version表,我们主要来看system.user表,这张表是用来存放超级管理员的。

    b.4 (db.system.users.find())首先使用命令查询system.user表中含有数据否,输入命令:db.system.users.find(),查询发现数据库是空的,这时候我们给这个表添加一个管理员账户。

  d 添加用户并且为用户指定角色和数据库,命令如图所示:

    图片 2

    d.1 user:用户名

    d.2 pwd:密码

    d.3 customData:描述字段

    d.4 roles:指定用户的角色,可以用一个空数组给新用户设置空角色,在roles字段可以指定内置角色和用户定义的角色,内置角色在在第四个模块我们专门回来说它。

  e (show users、db.system.users.find())当创建完用户之后,我们可以用前面的两个命令来查询用户的信息,自行查询眼看。

  f  当添加完用户信息之后,我们的想法就是马上重新连接验证是否权限已经控制,这里就打击你了,当然还没有控制,这里我们还需要开启用户权限验证,因为MongoDB默认是不开启权限验证的,下面我们简单说一下如何开启权限验证。

创建用户,用户是跟着库走,哪个库下创建那个库下验证。

use test
db.createUser(
{
user: "liyuhuan",
pwd: "jkinfo",
roles: [
{ role: "readWrite", db: "test" },{ role: "backup", db: "test" },{ role: "restore", db: "test" },{ role: "dbAdmin", db: "test" }
]
}
)

摘要:
MongoDB 3.0 安全权限访问控制,在添加用户上面3.0版本和之前的版本有很大的区别,这里就说明下3.0的添加用户的方法。
环境、测试:
在安装MongoDB之后,先关闭auth认证,进入查看数据库,只有一个local库,admin库是不存在的:
root@zhoujinyi:/usr/local/mongo4# mongo --port=27020MongoDB shell version: 3.0.4connecting to: 127.0.0.1:27020/test2015-06-29T09:31:08.673-0400 I CONTROL [initandlisten] > show dbs;local 0.078GB

现在需要创建一个帐号,该账号需要有grant权限,即:账号管理的授权权限。注意一点,帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth)。

> use adminswitched to db admin>
 db.createUser({ user: "dba", pwd: "dba",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]****... }... )**Successfully added user: { "user" : "dba", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ]}

上面加粗的就是执行的命令:
user:用户名
pwd:密码
roles:指定用户的角色,可以用一个空数组给新用户设定空角色;在roles字段,可以指定内置角色和用户定义的角色。role里的角色可以选:

图片 3

复制代码

Built-In Roles(内置角色): 1. 数据库用户角色:read、readWrite; 2. 数据库管理角色:dbAdmin、dbOwner、userAdmin; 3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;

  1. 备份恢复角色:backup、restore; 5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  2. 超级用户角色:root // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase) 7. 内部角色:__system

图片 4

复制代码

具体角色:

图片 5

复制代码

Read:允许用户读取指定数据库readWrite:允许用户读写指定数据库dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profileuserAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。root:只在admin数据库中可用。超级账号,超级权限

图片 6

复制代码

刚建立了 userAdminAnyDatabase角色,用来管理用户,可以通过这个角色来创建、删除用户。验证:需要开启auth参数。


图片 7


复制代码


root@zhoujinyi:/usr/local/mongo4# mongo --port=27020MongoDB shell version: 3.0.4connecting to: 127.0.0.1:27020/test> show dbs; ####没有验证,导致没权限。2015-06-29T10:02:16.634-0400 E QUERY Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }", "code" : 13} at Error (<anonymous>) at Mongo.getDBs (src/mongo/shell/mongo.js:47:15) at shellHelper.show (src/mongo/shell/utils.js:630:33) at shellHelper (src/mongo/shell/utils.js:524:36) at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47> use admin #验证,因为在admin下面添加的帐号,所以要到admin下面验证。switched to db admin> db.auth('dba','dba')1> show dbs;admin 0.078GBlocal 0.078GB> use test #在test库里创建帐号switched to db test> db.createUser(... {... user: "zjyr",... pwd: "zjyr",... roles: [... { role: "read", db: "test" } #只读帐号... ]... }... )Successfully added user: { "user" : "zjyr", "roles" : [ { "role" : "read", "db" : "test" } ]}>** db.createUser(... {... user: "zjy",... pwd: "zjy",... roles: [... { role: "readWrite", db: "test" } #读写帐号... ]... }... )Successfully added user: { "user" : "zjy", "roles" : [ { "role" : "readWrite", ** #读写账号 "db" : "test" } ]}> show users; #查看当前库下的用户{ "_id" : "test.zjyr", "user" : "zjyr", "db" : "test", "roles" : [ { "role" : "read", "db" : "test" } ]}{ "_id" : "test.zjy", "user" : "zjy", "db" : "test", "roles" : [ { "role" : "readWrite", "db" : "test" } ]}

图片 8

复制代码

上面创建了2个帐号,现在验证下:验证前提需要一个集合

图片 9

复制代码

db.abc.insert({"a":1,"b":2}) ** #插入失败,没有权限,userAdminAnyDatabase 权限只是针对用户管理的,对其他是没有权限的。WriteResult({ "writeError" : { "code" : 13, "errmsg" : "not authorized on test to execute command { insert: "abc", documents: [ { _id: ObjectId('55915185d629831d887ce2cb'), a: 1.0, b: 2.0 } ], ordered: true }" }})> byeroot@zhoujinyi:/usr/local/mongo4# mongo --port=27020MongoDB shell version: 3.0.4connecting to: 127.0.0.1:27020/test> use testswitched to db test> db.auth('zjy','zjy') ** #用创建的readWrite帐号进行写入1> db.abc.insert({"a":1,"b":2})WriteResult({ "nInserted" : 1 })> db.abc.insert({"a":11,"b":22})WriteResult({ "nInserted" : 1 })> db.abc.insert({"a":111,"b":222})WriteResult({ "nInserted" : 1 })> db.abc.find(){ "_id" : ObjectId("559151a1b78649ebd8316853"), "a" : 1, "b" : 2 }{ "_id" : ObjectId("559151cab78649ebd8316854"), "a" : 11, "b" : 22 }{ "_id" : ObjectId("559151ceb78649ebd8316855"), "a" : 111, "b" : 222 }> db.auth('zjyr','zjyr') ** #切换到只有read权限的帐号**1> db.abc.insert({"a":1111,"b":2222}) #不能写入WriteResult({ "writeError" : { "code" : 13, "errmsg" : "not authorized on test to execute command { insert: "abc", documents: [ { _id: ObjectId('559151ebb78649ebd8316856'), a: 1111.0, b: 2222.0 } ], ordered: true }" }})> db.abc.find() #可以查看{ "_id" : ObjectId("559151a1b78649ebd8316853"), "a" : 1, "b" : 2 }{ "_id" : ObjectId("559151cab78649ebd8316854"), "a" : 11, "b" : 22 }{ "_id" : ObjectId("559151ceb78649ebd8316855"), "a" : 111, "b" : 222 }

图片 10

复制代码

有没有一个超级权限?不仅可以授权,而且也可以对集合进行任意操作?答案是肯定的,只是不建议使用。那就是role角色设置成root

图片 11

复制代码

db.auth('dba','dba')1>** db.createUser(... {... user: "zhoujinyi",... pwd: "zhoujinyi",... roles: [... { role: "root", db: "admin" } #超级root帐号... ]... }... )Successfully added user: { "user" : "zhoujinyi", "roles" : [ { "role" : "root", "db" : "admin" } ]}> > show users; #查看当前库下的用户{ "_id" : "admin.dba", "user" : "dba", "db" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ]}{ "_id" : "admin.zhoujinyi", "user" : "zhoujinyi", "db" : "admin", "roles" : [ { "role" : "root", "db" : "admin" } ]}> use adminswitched to db admin> db.auth('zhoujinyi','zhoujinyi')1> use testswitched to db test> db.abc.insert({"a":1,"b":2})WriteResult({ "nInserted" : 1 })> db.abc.insert({"a":1111,"b":2222}) ** #权限都有WriteResult({ "nInserted" : 1 })> db.abc.find(){ "_id" : ObjectId("5591539bb78649ebd8316857"), "a" : 1, "b" : 2 }{ "_id" : ObjectId("559153a0b78649ebd8316858"), "a" : 1111, "b" : 2222 }> db.abc.remove({})WriteResult({ "nRemoved" : 2 })

图片 12

复制代码

因为帐号都是在当前需要授权的数据库下授权的,那要是不在当前数据库下会怎么样?

图片 13

复制代码

dbadmin>** db.createUser(... {... user: "dxy",... pwd: "dxy",... roles: [... { role: "readWrite", db: "test" },#在当前库下创建其他库的帐号,在admin库下创建test、abc库的帐号... { role: "readWrite", db: "abc" } ... ]... }... )Successfully added user: { "user" : "dxy", "roles" : [ { "role" : "readWrite", "db" : "test" }, { "role" : "readWrite", "db" : "abc" } ]}> > show users;{ "_id" : "admin.dba", "user" : "dba", "db" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ]}{ "_id" : "admin.zhoujinyi", "user" : "zhoujinyi", "db" : "admin", "roles" : [ { "role" : "root", "db" : "admin" } ]}{ "_id" : "admin.dxy", "user" : "dxy", "db" : "admin", "roles" : [ { "role" : "readWrite", "db" : "test" }, { "role" : "readWrite", "db" : "abc" } ]}> use testswitched to db test> db.auth('dxy','dxy') ** #在admin下创建的帐号,不能直接在其他库验证,Error: 18 Authentication failed.0> use adminswitched to db admin ** #只能在帐号创建库下认证,再去其他库进行操作。**> db.auth('dxy','dxy')1> use testswitched to db test> db.abc.insert({"a":1111,"b":2222})WriteResult({ "nInserted" : 1 })> use abcswitched to db abc> db.abc.insert({"a":1111,"b":2222})WriteResult({ "nInserted" : 1 })

图片 14

复制代码

上面更加进一步说明数据库帐号是跟着数据库来走的,哪里创建哪里认证。
创建了这么多帐号,怎么查看所有帐号

图片 15

复制代码

use adminswitched to db admin> db.auth('dba','dba')1>** db.system.users.find().pretty()**{ "_id" : "admin.dba", "user" : "dba", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "KfDUzCOIUo7WVjFr64ZOcQ==", "storedKey" : "t4sPsKG2dXnZztVYj5EgdUzT9sc=", "serverKey" : "2vCGiq9NIc1zKqeEL6VvO4rP26A=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ]}{ "_id" : "test.zjyr", "user" : "zjyr", "db" : "test", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "h1gOW3J7wzJuTqgmmQgJKQ==", "storedKey" : "7lkoANdxM2py0qiDBzFaZYPp1cM=", "serverKey" : "Qyu6IRNyaKLUvqJ2CAa/tQYY36c=" } }, "roles" : [ { "role" : "read", "db" : "test" } ]}{ "_id" : "test.zjy", "user" : "zjy", "db" : "test", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "afwaKuTYPWwbDBduQ4Hm7g==", "storedKey" : "ebb2LYLn4hiOVlZqgrAKBdStfn8=", "serverKey" : "LG2qWwuuV+FNMmr9lWs+Rb3DIhQ=" } }, "roles" : [ { "role" : "readWrite", "db" : "test" } ]}{ "_id" : "admin.zhoujinyi", "user" : "zhoujinyi", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "pE2cSOYtBOYevk8tqrwbSQ==", "storedKey" : "TwMxdnlB5Eiaqg4tNh9ByNuUp9A=", "serverKey" : "Mofr9ohVlFfR6/md4LMRkOhXouc=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ]}{ "_id" : "admin.dxy", "user" : "dxy", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "XD6smcWX4tdg/ZJPoLxxRg==", "storedKey" : "F4uiayykHDp/r9krAKZjdr+gqjM=", "serverKey" : "Kf51IU9J3RIrB8CFn5Z5hEKMSkw=" } }, "roles" : [ { "role" : "readWrite", "db" : "test" }, { "role" : "readWrite", "db" : "abc" } ]}> db.system.users.find().count()5

图片 16

复制代码

备份还原使用那个角色的帐号?之前创建的帐号zjy:test库读写权限;zjyr:test库读权限

图片 17

复制代码

root@zhoujinyi:~# mongodump --port=27020 -uzjyr -pzjyr --db=test -o backup ** #只要读权限就可以备份**2015-06-29T11:20:04.864-0400 writing test.abc to backup/test/abc.bson2015-06-29T11:20:04.865-0400 writing test.abc metadata to backup/test/abc.metadata.json2015-06-29T11:20:04.866-0400 done dumping test.abc2015-06-29T11:20:04.867-0400 writing test.system.indexes to backup/test/system.indexes.bsonroot@zhoujinyi:~# mongorestore --port=27020 -uzjy -pzjy --db=test backup/test/ #读写权限可以进行还原2015-06-29T11:20:26.607-0400 building a list of collections to restore from backup/test/ dir2015-06-29T11:20:26.609-0400 reading metadata file from backup/test/abc.metadata.json2015-06-29T11:20:26.609-0400 restoring test.abc from file backup/test/abc.bson2015-06-29T11:20:26.611-0400 error: E11000 duplicate key error index: test.abc.$id dup key: { : ObjectId('559154efb78649ebd831685a') }2015-06-29T11:20:26.611-0400 restoring indexes for collection test.abc from metadata2015-06-29T11:20:26.612-0400 finished restoring test.abc2015-06-29T11:20:26.612-0400 done

图片 18

复制代码

3 MongoDB开启用户权限验证**

  a 通过上面的简单介绍我们已经配置了用户和密码以及角色,但是正如上面最后一步我所说,这里登录还是登录不了,那么是因为我们没有开启用户权限验证,如何开启这个权限验证呢。

  b 首先我们打开上一篇我们配置的mongodb.conf配置文件,我的安装路径是:(/usr/local/kencery/mongoDB/mongodb/bin/),使用vim打开,找到这样一个属性(auth=true),将前面的注释去掉,保存。

  c 重启MongoDB服务,因为我在前面已经将MongoDB设置为服务,所以我使用下面的命令即可对MongoDB进行关闭和重启

    c.1 service mongod stop

    c.2 service mongod start

  d 重启之后我们在连接数据库然后切换到admin数据库下,使用db.system.users.find()命令查看,如下图所示,则说明配置已经成功
   图片 19 

  e 如上图所示,提示信息提示我们没有对其进行授权,此时,我们输入如下命令进行授权,授权之后我们使用查询命令去查询发现已经可以查询,到这里简单权限已经设置完成。

    e.1 db.auth("kencery","kencery")  

TAG标签:
版权声明:本文由金沙澳门官网4166发布于世界史,转载请注明出处:权限管理,用户角色