使用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" } ] }