使用Shell和Java驱动程序的MongoDB身份验证配置示例
身份验证使用户可以在连接到数据库之前验证身份。
首先,应创建具有管理员权限的用户,然后可以添加其他用户。
现在创建一个具有管理员权限的用户
在不进行身份验证的情况下启动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"
}
]
}

