MongoDB 内置角色

(1).数据库用户角色

针对每一个数据库进行控制。
read :提供了读取所有非系统集合,以及系统集合中的system.indexes, system.js, system.namespaces
readWrite: 包含了所有read权限,以及修改所有非系统集合的和系统集合中的system.js的权限.

 

(2).数据库管理角色

每一个数据库包含了下面的数据库管理角色。
dbOwner:该数据库的所有者,具有该数据库的全部权限。
dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。(参考:http://docs.mongodb.org/manual/reference/built-in-roles/#dbAdmin
userAdmin:为当前用户创建、修改用户和角色。拥有userAdmin权限的用户可以将该数据库的任意权限赋予任意的用户。

 

(3).集群管理权限

admin数据库包含了下面的角色,用户管理整个系统,而非单个数据库。这些权限包含了复制集和共享集群的管理函数。
clusterAdmin:提供了最大的集群管理功能。相当于clusterManager, clusterMonitor, and hostManager和dropDatabase的权限组合。
clusterManager:提供了集群和复制集管理和监控操作。拥有该权限的用户可以操作config和local数据库(即分片和复制功能)
clusterMonitor:仅仅监控集群和复制集。
hostManager:提供了监控和管理服务器的权限,包括shutdown节点,logrotate, repairDatabase等。
备份恢复权限:admin数据库中包含了备份恢复数据的角色。包括backup、restore等等。

 

(4).所有数据库角色

admin数据库提供了一个mongod实例中所有数据库的权限角色:
readAnyDatabase:具有read每一个数据库权限。但是不包括应用到集群中的数据库。
readWriteAnyDatabase:具有readWrite每一个数据库权限。但是不包括应用到集群中的数据库。
userAdminAnyDatabase:具有userAdmin每一个数据库权限,但是不包括应用到集群中的数据库。
dbAdminAnyDatabase:提供了dbAdmin每一个数据库权限,但是不包括应用到集群中的数据库。

(5). 超级管理员权限

root: dbadmin到admin数据库、useradmin到admin数据库以及UserAdminAnyDatabase。但它不具有备份恢复、直接操作system.*集合的权限,但是拥有root权限的超级用户可以自己给自己赋予这些权限。

(6). 备份恢复角色:backup、restore;

(7). 内部角色:__system

PS:关于每个角色所拥有的操作权限可以点击上面的内置角色链接查看详情。

官方实例

  1. use products # mongoDB的权限设置是以库为单位的,必选要先选择库  
  2. db.createUser(   
  3. "user" : "accountAdmin01",   
  4.  "pwd": "cleartext password",  
  5.  "customData" : { employeeId: 12345 },  
  6.  "roles" : [ { role: "clusterAdmin", db: "admin" },   
  7.              { role: "readAnyDatabase", db: "admin" },  
  8.              "readWrite" ] },  
  9. { w: "majority" , wtimeout: 5000 } ) # readWrite 适用于products库,clusterAdmin与readAnyDatabase角色适用于admin库  

 

熟 悉 Oracle 的童鞋们都知道,数据库用户有两种,一种是管理员,用来管理用户,一种是普通用户,用来访问数据。类似的,为 MongoDB 规划用户鉴权时,至少要规划两种角色:用户管理员和数据库用户。如果搭建了分片或主从,可能还会要规划数据库架构管理员的角色,它们专门用来调整数据库的 分布式架构。

在创建用户之前,我们首先要修改 MongoDB 的启动方式。缺省方式下 MongoDB 是不进行鉴权检查的。我们只要在运行 MongoDB 的命令后面加上一个 --auth 参数即可,例如:

  1. mongod --dbpath ./db1 --port 20000 --auth  

 

MongoDB默认不启用安全授权机制。在单节点环境下,你需要在启动mongod时指定–auth,或者在参数里设置auth=true来启用这个特性。

如果上述命令无效的话,那就 手动开启用户权限认证

  1. [gideon@ikeepstudying]$ vi /etc/mongodb.conf           //将auth=true前面的注释拿掉  
  2. [gideon@ikeepstudying]$ /etc/init.d/mongod restart      //重启生效  
  3. // 或者使用 sudo service mongod restart 重启  

 

如何创建用户管理员

用户管理员是第一个要创建的用户。在没有创建任何用户之前,你可以随意创建用户;但数据库中一旦有了用户,那么未登录的客户端就没有权限做任何操作了,除非使用db.auth(username, password)方法登录。

用户管理员的角色名叫 userAdminAnyDatabase,这个角色只能在 admin 数据库中创建。下面是一个例子:

  1. > use admin  
  2. switched to db admin  
  3. > db.createUser({user:"root",pwd:"root123",roles:["userAdminAnyDatabase"]})  
  4. Successfully added user: { "user" : "root", "roles" : [ "userAdminAnyDatabase" ] }  

 

这个例子创建了一个名为 root 的用户管理员。创建完了这个用户之后,我们应该马上以该用户的身份登录:

  1. > db.auth("root","root123")  
  2. 1  

 

db.auth() 方法返回 1 表示登录成功。接下来我们为指定的数据库创建访问所需的账号。

 

如何创建数据库用户

首先保证你已经以用户管理员的身份登录 admin 数据库。然后用 use 命令切换到目标数据库,同样用db.createUser() 命令来创建用户,其中角色名为 “readWrite”。

普通的数据库用户角色有两种,read 和 readWrite。顾名思义,前者只能读取数据不能修改,后者可以读取和修改。

下面是一个例子:

  1. > use test  
  2. switched to db test  
  3. > db.createUser({user:"testuser",pwd:"testpass",roles:["readWrite"]})  
  4. Successfully added user: { "user" : "testuser", "roles" : [ "readWrite" ] }  
  5. > db.auth("testuser","testpass")  
  6. 1  

 

这样 MongoDB 的数据安全性就得到保障了,没有登录的客户端将无法执行任何命令。

除了db.createUser(),下面几个函数也是常用的:
获得数据库的所有用户权限信息:db.getUsers()
获得某个用户的权限信息:db.getUser()
创建角色: db.createRole()
更新角色:db.updateRole()
删除角色:db.dropRole()
获得某个角色信息:db.getRole()
删除用户:db.dropUser()
删除所有用户:db.dropAllUsers()
将一个角色赋予给用户:db.grantRolesToUser()
撤销某个用户的某个角色权限:db.revokeRolesFromUser()
更改密码:db.changeUserPassword()
更多内容可以去看下 reference

那么,设置完这些后,如果需要登陆Rockmongo的话,可参考如下设置:

进入Rockmongo安装的根目录下,通常在/var/www/rockmongo路径下。找到config.php文件并打开,在文件下面添加如下几行配置代码:

  1. /** 
  2.  * This is the configuration  for remote mongodb 
  3.  */  
  4. $MONGO["servers"][$i]["mongo_name"] = "The name of mongodb"; // 随便自己命名,显示在rockmongo的db昵称,如: mongoHQ-helloworld  
  5. $MONGO["servers"][$i]["mongo_host"] = "The host of mongodb"; // 远程mongodb服务器的主域名,如:troup.mongohq.com  
  6. $MONGO["servers"][$i]["mongo_port"] = "The port of mongodb"; // 远程mongodb服务器提供的端口,如37017  
  7. $MONGO["servers"][$i]["mongo_user"] = "The username of mongodb"; // 拥有权限操作该db的用户名,如:pigerla  
  8. $MONGO["servers"][$i]["mongo_pass"] = "The password of mongodb"; // 拥有权限操作该db的用户密码,如:xxxxxx  
  9. $MONGO["servers"][$i]["mongo_db"] = "The database's name of mongodb"; // 数据库的名称,如:helloworld  
  10. $MONGO["servers"][$i]["mongo_auth"] = false; // 当值为false时,表示rockmongo使用这里的配置去连接远程mongodb,否则,只能在rockmongo登录界面输入以上信息进行登录  
  11. $MONGO["servers"][$i]["control_users"]["admin"] = "admin"; // 当mongo_auth为false时,这设置才有效,表示在rockmongo登录界面,用户名为admin,密码为  
  12. admin,这也是默认配置。  
  13. $i ++;  

 

我个人设置如下:

  1. /**  
  2. * Configuration of MongoDB servers 
  3. *  
  4. * @see more details at http://rockmongo.com/wiki/configuration?lang=en_us 
  5. */  
  6. $MONGO["servers"][$i]["mongo_name"] = "Localhost";//mongo server name  
  7. //$MONGO["servers"][$i]["mongo_sock"] = "/var/run/mongo.sock";//mongo socket path (instead of host and port)  
  8. $MONGO["servers"][$i]["mongo_host"] = "127.0.0.1";//mongo host  
  9. $MONGO["servers"][$i]["mongo_port"] = "27017";//mongo port  
  10. $MONGO["servers"][$i]["mongo_timeout"] = 0;//mongo connection timeout  
  11. //$MONGO["servers"][$i]["mongo_db"] = "MONGO_DATABASE";//default mongo db to connect, works only if mongo_auth=false  
  12. //$MONGO["servers"][$i]["mongo_user"] = "MONGO_USERNAME";//mongo authentication user name, works only if mongo_auth=false  
  13. //$MONGO["servers"][$i]["mongo_pass"] = "MONGO_PASSWORD";//mongo authentication password, works only if mongo_auth=false  
  14. $MONGO["servers"][$i]["mongo_auth"] = TRUE;//enable mongo authentication?  
  15.   
  16. $MONGO["servers"][$i]["control_auth"] = true;//enable control users, works only if mongo_auth=false  
  17. $MONGO["servers"][$i]["control_users"]["admin"] = "admin";//one of control users ["USERNAME"]=PASSWORD, works only if mongo_auth=false  
  18.   
  19. $MONGO["servers"][$i]["ui_only_dbs"] = "";//databases to display  
  20. $MONGO["servers"][$i]["ui_hide_dbs"] = "";//databases to hide  
  21. $MONGO["servers"][$i]["ui_hide_collections"] = "";//collections to hide  
  22. $MONGO["servers"][$i]["ui_hide_system_collections"] = false;//whether hide the system collections  
  23.   
  24. //$MONGO["servers"][$i]["docs_nature_order"] = false;//whether show documents by nature order, default is by _id field  
  25. //$MONGO["servers"][$i]["docs_render"] = "default";//document highlight render, can be "default" or "plain"  
  26.   
  27. $i ++;  

 

这样,rockmongo可以自动查询登陆信息是否正确了。

另外 mongo_host 和 mongo_port 都可以在 /etc/mongodb.conf 文件中找到,下面是我个人的截图:

Selection_063

posted @ 2016-08-15 15:39  浅诺〃深念℃  阅读(11770)  评论(1编辑  收藏  举报