使用Shell和Java驱动程序的MongoDB身份验证配置示例

时间:2020-02-23 14:37:21  来源:igfitidea点击:

身份验证使用户可以在连接到数据库之前验证身份。
首先,应创建具有管理员权限的用户,然后可以添加其他用户。

现在创建一个具有管理员权限的用户

  • 在不进行身份验证的情况下启动MongoDB服务器(在命令行中使用mongod)

  • 创建具有管理员权限的用户,如下所示
    createUser命令在数据库" admin"中创建由pwd字段认证的用户" Adam",该角色为管理员角色userAdminAnyDatabase。

  • 在mongodb服务文件中指定授权–auth,然后使用身份验证重新启动mongodb服务。

  • 使用管理员用户凭据登录到mongo shell;
    让我们验证刚刚创建的用户的特权
    runCommand接受包含用户名的usersInfo字段,并将showprivileges设置为true。
    这将显示授予用户" Adam"的特权。
    上面的命令列出了很多与用户特权有关的数据。

创建用户时分配角色

让我们使用CreateUser命令创建新用户,并将角色关联到该用户。

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

在数据库car和test上为用户" Hyman"添加了"读取"角色。
如果尝试插入文档,则由于指定了只读角色,因此会出现错误。

mongo -u  Adam -p admin --authenticationDatabase admin

创建角色

createRole命令用于为用户创建一个新角色。

>db.runCommand(               
 {  usersInfo:  { user: "Adam", db: "admin" },   showPrivileges: true  } 
)
{
	"users" : [
		{
			"_id" : "admin.Adam",
			"user" : "Adam",
			"db" : "admin",
			"roles" : [
				{
					"role" : "userAdminAnyDatabase",
					"db" : "admin"
				}
			],
... continues listing many attributes.

" userRole"有权终止create role命令中指定的任何操作。
inprog是系统级别的角色,它显示活动或者挂起的操作。
有许多内置角色,例如读取,读写,dbadmin等。
每个角色都与诸如killop,inprog等操作关联。

授予角色

使用grantRolesToUser方法将权限授予用户;

>use admin
switched to db admin
>db.createUser(
  {
    user: "Hyman",
    pwd: "Hyman",
    roles: [
       { role: "read", db: "test" },
       { role: "read", db: "car" },
       ]
  }
)
Successfully added user: {
	"user" : "Hyman",
	"roles" : [
		{
			"role" : "read",
			"db" : "test"
		},
		{
			"role" : "read",
			"db" : "car"
		}
	]
}
>

识别用户角色

usersInfo命令或者db.getUser()方法用于获取用户信息。

WriteResult({
	"writeError" : {
		"code" : 13,
		"errmsg" : "not authorized on test to execute command { insert: \"products\", documents: [ { _id: ObjectId('5479b0dc9d9c8808eadff8b7'), item: \"card\", qty: 15.0 } ], ordered: true }"
	}
})

如您所见,我们现在已经为Hyman用户提供了readwrite角色。

撤销角色

如果您想撤消任何角色,我们可以按照以下步骤进行操作

>use admin
switched to db admin
>db.createRole(
 {
   role: "userRole",
   privileges: [
     { resource: { cluster: true }, actions: [ "killop", "inprog" ] },
     { resource: { db: "", collection: "" }, actions: [ "killCursors" ] }
   ],
   roles: []
 }
)
{
	"role" : "userRole",
	"privileges" : [
		{
			"resource" : {
				"cluster" : true
			},
			"actions" : [
				"killop",
				"inprog"
			]
		},
		{
			"resource" : {
				"db" : "",
				"collection" : ""
			},
			"actions" : [
				"killCursors"
			]
		}
	],
	"roles" : [ ]
}
>

如下所示,该用户不再具有读写权限。

>use admin
switched to db admin
>db.grantRolesToUser(
"Hyman",
[
  {
    role: "readWrite", db: "admin"
  },
  {
    role: "readAnyDatabase", db:"admin"
  }
]
)

修改用户密码

要更改密码,请使用changeUserPassword方法:

>db.getUser("Hyman")
{
	"_id" : "admin.Hyman",
	"user" : "Hyman",
	"db" : "admin",
	"roles" : [
		{
			"role" : "readWrite",
			"db" : "admin"
		},
		{
			"role" : "read",
			"db" : "car"
		},
		{
			"role" : "readAnyDatabase",
			"db" : "admin"
		},
		{
			"role" : "read",
			"db" : "test"
		}
	]
}

现在,如果我们尝试使用旧密码登录,则会引发异常"登录失败异常"。

MongoDB Java身份验证程序

下面是一个简单的程序,显示了如何以编程方式传递MongoDB数据库用户/密码详细信息。
请注意,我使用的是mongo-java-driver版本2.13.0-rc0,如果您使用的是其他版本,则创建MongoCredentials的方式可能需要进行一些更改。

>db.revokeRolesFromUser(
  "Hyman",
 [
  { role: "readWrite", db: "admin" }
  ]
 )

上面的程序产生以下输出。

db.getUser("Hyman")
{
	"_id" : "admin.Hyman",
	"user" : "Hyman",
	"db" : "admin",
	"roles" : [
		{
			"role" : "read",
			"db" : "car"
		},
		{
			"role" : "readAnyDatabase",
			"db" : "admin"
		},
		{
			"role" : "read",
			"db" : "test"
		}
	]
}