MongoDB创建用户

创建用户语法格式

>use admin
>db.createUser(
	{
		user:'user',
		pwd :'123',
		customData:{"desc":"This user is for administrators"},
		roles:[
				{
					role:'userAdminAnyDatabase',db:'admin'
				}
		]
	}
)

结构详解:

	user		:用户名  --必须项
	pwd 		:密码	  --必须项
	customData	:用于描述账户信息  --非必须项
	roles		:指定用户的角色,可以用一个空数组给新用户设定空角色;在roles字段,可以指定内置角色和用户定义的角色。--必须项(可以为空集合)
		role里的角色可以选:
			1、Built-In Roles(内置角色):
				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
			2、具体角色: 
				Read				:允许用户读取指定数据库
				readWrite			:允许用户读写指定数据库
				backup,retore		:在进行备份、恢复时可以单独指定的角色,在db.createUser()方法中roles里面的db必须写成是admin库,要不然会报错
				dbAdmin				:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
				userAdmin			:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
				clusterAdmin		:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
				readAnyDatabase		:只在admin数据库中可用,赋予用户所有数据库的读权限
				readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
				userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限,
				dbAdminAnyDatabase	:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
				root				:只在admin数据库中可用。超级账号,超级权限

具体权限的用户例子:


创建超级管理员用户

	use admin
	db.createUser({user:'root',pwd:'123', roles:[{role:'root', db:'admin'}]}) 

创建用户管理员账户(能查询其他库集合,但不能查询集合内容

	use admin
	db.createUser({user:'userAdmin',pwd:'123', roles:[{role:'userAdminAnyDatabase', db:'admin'}]})

创建访问任意库读写的账户

	use admin
	db.createUser({user:'rwUser',pwd:'123', roles:[{role:'readWriteAnyDatabase', db:'admin'}]})

创建只对test库有读写权限的用户

	use test
	db.createUser({user:'testUser',pwd:'123',roles:[{role:'readWrite',db:'test'}]})

创建用于备份时的用户,如若是恢复权限,则将backup换为restore即可

	use admin
	db.createUser({user:"bkUser",pwd:"123",roles:[{role:"backup",db:"admin"}]})

		注:新建backup账户时,roles里面的db必须是admin,要不然会报错,如下:
			>db.createUser({user:"bkUser2",pwd:"123",roles:[{role:"backup",db:"test"}]})
			Error: couldn't add user: No role named backup@test

验证新建用户:

**用户在哪个库新建授权,则需要在哪个库进行auth验证**

>db     ---查看当前所在库
test
>db.createUser({user:'test1',pwd:'test1',roles:[{role:'readWrite',db:'test'},{role:'read',db:'Johnny'})})
>use Johnny
Johnny
>db.auth('test1','test1')
Error:Authentication failed.
0         ---表示auth验证失败
>use test
>db.auth('test1','test1')
1          ---表示验证成功

所以,特别注意:用户在哪个库创建,就必须要在哪个库auth认证,并在mongo登录时也要先连接认证库

查询用户:

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

		>use admin
		>db.system.users.find().pretty()     ---将所有用户信息查询出来

显示某一库下的所有用户

		>use test
		>show users                   ---显示在此库授权的用户信息

查询指定用户的相关信息:

		>db
		Johnny
		>db.getUser("jianlong")     ---需要在用户所在库才能执行此命令并获得信息,查询到的信息和“show user”一样,只是可以指定用户罢了
		{
			"_id" : "Johnny.jianlong",
			"user" : "jianlong",
			"db" : "Johnny",
			"roles" : [
					{
						"role" : "readWrite",
						"db" : "test"
					},
					{
						"role" : "readWrite",
						"db" : "Johnny"
					}
			]
		}
		> use tt               
		switched to db tt
		> db.getUser("jianlong")          ---在账户非授权库进行用户信息查询则会提示NULL

修改用户


语法格式

	db.updateUser(
		"<username>",
		{
			customData : { <any information> },
			roles : [
					{ role: "<role>", db: "<database>" } | "<role>",
					...
			],
			pwd: "<cleartext password>"
		},
		writeConcern: { <write concern> }
	)

结构详解

	username:要修改的用户的用户名  --必须项
	update部分: ----必须项(至少其中一项)
		customData:描述性信息 
		roles:修改的角色们 
			role:角色名
			db  :数据库
		pwd:用户对应的密码
	writeConcern:用来指定mongod对写操作的回执行为

修改用户权限,但会覆盖原先的所有权限

		例:
		> db.updateUser("root",
			{
				roles:[
						{	role:"readWriteAnyDatabase",
		  				db:"admin"
						}
				]                       
			}
		)

修改用户权限,不会覆盖原权限信息,只新增权限:

		> use Johnny
		switched to db Johnny
		> db.grantRolesToUser(
			"jianlong",
			[
				{
					role:'readWrite',
					db:'test'
				}
			]
		)     ---
		> show users;
		{
			"_id" : "Johnny.jianlong",
			"user" : "jianlong",
			"db" : "Johnny",
			"roles" : [
					{
						"role" : "readWrite",
						"db"  :  "test"
					},
					{
						"role" : "readWrite",
						"db" : "Johnny"
					}
			]
		}
		>use tt
		> db.grantRolesToUser(
			"jianlong",
			[
				{
					role:'read',
					db:'tt'
				}
			]
		)
		Error: Could not find user jianlong@tt      
			---不能在用户非授权库进行用户的权限添加,否则会报错,即表现出账户随库走的特点

修改用户密码:

 	db.changeUserPassword(“username","newPasswd")
		例子:
			> use tt
			switched to db tt
			> db.changeUserPassword("tuser","123456")          
				---注意要在账户所在授权库执行此命令

删除用户

>db.dropUser("test1")

用户自定义角色Role

语法格式:

	>db.createRole(
		{
			role: "<name>",
			privileges: [
				{ resource: { <resource> }, actions: [ "<action>", ... ] },
				...
			],
			roles: [
				{ role: "<role>", db: "<database>" } | "<role>",
				...
				]
		}
	)

结构解析:

	role:自定义的角色名称  --必须项
	privileges:配置具体对象的权限  ----必须项
		resource:角色拥有的资源(collection)
		action:对某集合的find,insert等权限
	roles:继承其他角色权限
		role:要继承的角色名称
		db:数据库
	官方网站上的一句话:
		Except for roles created in the admin database, a role can only include privileges that apply to its database and can only inherit from other roles in its database.
		翻译:除了admin库里的role以外,自定义角色拥有的权限只能应用到本库并且也只能从本库的角色进行权限继承(如果理解有误还望指点)
		测试结果:虽然配置角色权限时不能映射其他库的对象权限,但是角色可以跨库授权给用户(如果你不明白这句话,没关系,咱直接上实验)

创建角色

		db.createRole(
			{
				role:"SenderHis_Read",
				privileges:[
					{
						resource:{
							db:"APP_MSG_GW",
							collection:"SenderHis"
						},
						actions:["find"]
					}
				],
				roles:[
					{
						role:"read",
						db:"admin"
					}
				]
			}
		)

如果想在此角色上添加其他库中集合的查询权限则会报错:

		> db.grantPrivilegesToRole(
			"SenderHis_Read",
			[
				{
					resource:{
							db:"APP_SUPERPROXY",
							collection:"SenderHis"
						},
						actions:["find"]
				}
			]
		)
		{
			"Message":"Roles on the ‘APP_MSG_GW‘ database cannot be granted privileges that target other databases or the cluster"
		}

在APP_SUPERPROXY库上另建一角色

			db.createRole(
				{
					role:"MONITOR_Read",
					privileges:[
						{
							resource:{
								db:"APP_SUPERPROXY",
								collection:"MONITOR"
							},
							actions:["find"]
						}
					],
					roles:[]
				}
			)

此时可以将两个角色同时授权给APP_MSG_GW库下的一个用户,使其拥有两个库中某些集合的查询权限

			>use APP_MSG_GW
			>show users;
			{
				"_id" : "APP_MSG_GW.zbx_Moniter",
				"user" : "zbx_Moniter",
				"db" : "APP_MSG_GW",
				"customData" : {
					"desc" : "zabbix monitor account"
				},
				"roles" : [
					{
						"role" : "MONITOR_Read",
						"db" : "APP_SUPERPROXY"
					},
					{
						"role" : "SenderHis_Read",
						"db" : "APP_MSG_GW"
					}
				]
			}

查看角色的具体privilege(权限):

			>db.getRole("SenderHis_Read",{showPrivileges:true})
			另一参数:showBuiltinRoles

创建执行eval()命令的权限

官网地址:https://docs.mongodb.com/manual/reference/command/eval/#access-control

  • 说明:
    比如你想在Python脚本中调用写好的mongo存储函数(存于system.js系统表中),如果你只是拥有普通权限,那么执行的时候就会报错,就算是你用root账号去连接mongo来执行命令也没用

  • 解决办法:
    创建一个角色,拥有anyResource的anyAction的权限,之后赋角色给用户即可:

      	db.createRole(
      		{
      			role:"excute_eval_system",
      			privileges:[
      				{
      					resource:{
      						anyResource:true
      					},
      					actions:["anyAction"]
      				}
      			]
      		}
      	)      
    

注意事项:除非必须要外部调用eval,否则请慎重创建此角色且赋给用户

上一篇:Hadoop3 完全分布式运行模式-准备工作


下一篇:MongoDB用户权限操作语法及示例