千家信息网

MongoDb中怎么控制用户权限

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,今天就跟大家聊聊有关MongoDb中怎么控制用户权限,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Mongodb创建用户的语法在不用的版本之间
千家信息网最后更新 2025年01月21日MongoDb中怎么控制用户权限

今天就跟大家聊聊有关MongoDb中怎么控制用户权限,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

Mongodb创建用户的语法在不用的版本之间还是不一样的。我这里使用的版本3.0.6。版本3.0之前使用的是db.addUser(),但3.0之后使用的是db.createUser()。3.0后版本中再使用db.addUser()会报如下错误:

> db.addUser('dba','dba')2017-11-17T13:17:08.001+0800 E QUERY    TypeError: Property 'addUser' of object admin is not a function

如果数据库中还没有添加任何用户,要想新创建一个用户,要先把auth认证停掉,在进入数据库,也就是让auth=false。

[root@MidApp mongodb]# cat mongodb.conf#配置文件dbpath=/data/dblogpath=/usr/local/mongodb/logs/mongodb.loglogappend=trueport=27000fork=trueauth=falsenohttpinterface=falsebind_ip=192.168.221.161journal=falsequiet=true

登入数据库,只能看到一个库,看不到admin库:

[root@MidApp mongodb]# mongo 192.168.221.161:27000 MongoDB shell version: 3.0.6connecting to: 192.168.221.161:27000/test> show dbslocal  0.078GB

现在需要创建一个帐号,该账号需要有grant权限,即:账号管理的授权权限。注意一点,mongodb帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(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"}]}> db.system.users.find(){ "_id" : "admin.dba", "user" : "dba", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "MXvU7oJanxW7gPw+NwI7rw==", "storedKey" : "lTPmK31qbk1YKmx5stmYiphsQZE=", "serverKey" : "gVovcstiwC0nuU6LTXZAiWkucfA=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }> db.system.users.find().pretty(){"_id" : "admin.dba","user" : "dba","db" : "admin","credentials" : {"SCRAM-SHA-1" : {"iterationCount" : 10000,"salt" : "MXvU7oJanxW7gPw+NwI7rw==","storedKey" : "lTPmK31qbk1YKmx5stmYiphsQZE=","serverKey" : "gVovcstiwC0nuU6LTXZAiWkucfA="}},"roles" : [{"role" : "userAdminAnyDatabase","db" : "admin"}]}

可以看到创建了一个用户dba,密码dba,拥有admin库的userAdminAnyDatabase角色。下面看一下mongodb中的内置角色:

    1. 数据库用户角色:read、readWrite;    2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;    3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;    4. 备份恢复角色:backup、restore;    5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase    6. 超级用户角色:root      // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)    7. 内部角色:__system

看一下具体的角色定义:

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

我们打开auth参数,来验证一下。

[root@MidApp mongodb]# mongo 192.168.221.161:27000 MongoDB shell version: 3.0.6connecting to: 192.168.221.161:27000/test> show dbs#没有验证,不会有权限2017-11-17T13:04:35.357-0800 E QUERY    Error: listDatabases failed:{"ok" : 0,"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }","code" : 13}    at Error ()    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 dbsadmin  0.078GBlocal  0.078GB

可以看到,创建的dba用户已经验证成功。接下来我在创建两个用户,验证一下其他角色权限。创建一个只读用户,一个读写用户。

> use test;switched to db test> db.createUser({user:"zduser",pwd:"zduser",roles:[{role:"read",db:"test"}]})Successfully added user: {"user" : "zduser","roles" : [{"role" : "read","db" : "test"}]}> db.createUser({user:"dxuser",pwd:"dxuser",roles:[{role:"readWrite",db:"test"}]})Successfully added user: {"user" : "dxuser","roles" : [{"role" : "readWrite","db" : "test"}]}> show users;{"_id" : "test.zduser","user" : "zduser","db" : "test","roles" : [{"role" : "read","db" : "test"}]}{"_id" : "test.dxuser","user" : "dxuser","db" : "test","roles" : [{"role" : "readWrite","db" : "test"}]}>

在test库中创建一个集合,验证一下这两个用户权限:

> show tables;#userAdminAnyDatabase权限只针对用户管理,没有其他的权限2017-11-17T13:47:39.845-0800 E QUERY    Error: listCollections failed: {"ok" : 0,"errmsg" : "not authorized on test to execute command { listCollections: 1.0 }","code" : 13}    at Error ()    at DB._getCollectionInfosCommand (src/mongo/shell/db.js:646:15)    at DB.getCollectionInfos (src/mongo/shell/db.js:658:20)    at DB.getCollectionNames (src/mongo/shell/db.js:669:17)    at shellHelper.show (src/mongo/shell/utils.js:625:12)    at shellHelper (src/mongo/shell/utils.js:524:36)    at (shellhelp2):1:1 at src/mongo/shell/db.js:646> exitbye[root@MidApp mongodb]# mongo 192.168.221.161:27000 #重新登录一下MongoDB shell version: 3.0.6connecting to: 192.168.221.161:27000/test> use testswitched to db test> db.tb1.insert({"a":1,"b":2})#先试着插入数据看看WriteResult({"writeError" : {"code" : 13,"errmsg" : "not authorized on test to execute command { insert: \"tb1\", documents: [ { _id: ObjectId('5a0f595b3b6523dcb81d4f76'), a: 1.0, b: 2.0 } ], ordered: true }"}})> db.auth('dxuser','dxuser')#用可读写的用户认证1> db.tb1.insert({"a":1,"b":2})#可以插入数据WriteResult({ "nInserted" : 1 })> db.tb1.insert({"a":11,"b":22})WriteResult({ "nInserted" : 1 })> db.tb1.insert({"a":111,"b":222})WriteResult({ "nInserted" : 1 })> db.tb1.find(){ "_id" : ObjectId("5a0f597f3b6523dcb81d4f77"), "a" : 1, "b" : 2 }{ "_id" : ObjectId("5a0f59933b6523dcb81d4f78"), "a" : 11, "b" : 22 }{ "_id" : ObjectId("5a0f59983b6523dcb81d4f79"), "a" : 111, "b" : 222 }> db.auth('zduser','zduser')#切换只读用户1> db.tb1.insert({"a":1111,"b":2222})#没有权限插入数据WriteResult({"writeError" : {"code" : 13,"errmsg" : "not authorized on test to execute command { insert: \"tb1\", documents: [ { _id: ObjectId('5a0f59c63b6523dcb81d4f7a'), a: 1111.0, b: 2222.0 } ], ordered: true }"}})> db.tb1.find()#可以查看数据{ "_id" : ObjectId("5a0f597f3b6523dcb81d4f77"), "a" : 1, "b" : 2 }{ "_id" : ObjectId("5a0f59933b6523dcb81d4f78"), "a" : 11, "b" : 22 }{ "_id" : ObjectId("5a0f59983b6523dcb81d4f79"), "a" : 111, "b" : 222 }>

看完上述内容,你们对MongoDb中怎么控制用户权限有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

0