文档链接:https://docs.mongodb.com/manual/tutorial/enable-authentication/
Pre
个人总感觉数据库的文档结构不太友好, 不太解决问题。以下按照原文档结构翻译:
下面的教程以一个使用了默认认证机制的standalone mongod实例为背景来演示启用认证。
副本和集群分片的账户认证
请参考:
https://docs.mongodb.com/manual/core/security-internal-authentication/
账户管理
在启用access-control前,请先确认在admin数据库中,存在userAdmin或userAdminAnyDatabase角色的账户。
该角色账户拥有以下权限:创建账户、赋予账户角色、废除账户角色、创建/修改账户角色。
在启用access-control前后都可以创建账户。
如果还未创建任何账户便启用access-control,则MongoDB会抛出一个localhost exception,允许用户在admin数据库中创建一个账户管理员账号。一旦管理员账号建立,用户以账户管理员账号登陆后,才能添加其他账户。
步骤
以下步骤演示在未启用access-control的MongoDB实例中首次添加用户,然后开启的操作。
1. 不启用access-control启动MongoDB
mongod --port 27017 --dbpath /data/db
2. 连接到实例(本地)
mongo --port 27017
3. 创建用户管理员
创建一个userAdminAnyDatabase角色的用户。
> use admin > db.createUser( { user: "UserAdmin", pwd: "UserAdminPwd", roles: [{ role: 'userAdminAnyDatabase', db: 'admin' }] } )
退出mongo shell
4. 启用access-control,重启mongoDB
使用--auth选项重启mongod实例
mongod --auth --port 27017 --dbpath /data/db
启用access-control之后,用户需要先登陆才能进行操作。用户能够执行的操作由账户归属的角色决定。
5. 以管理员账号登陆
通过mongo shell,用户可以:
- 在连接实例时认证
- 进入shell, 通过db.auth()进行用户认证
连接时认证
mongo --port 27017 -u 'UserAdmin' -p 'UserAdminPwd' --authenticationDatabase "admin"
连接后认证
mongo --port 27017 > use admin > db.auth('UserAdmin', 'UserAdminPwd')
6. 创建其他账户
一旦登陆了管理员账户之后,就可以通过db.createUser()来创建其他账户。账户可以赋予mongoDB内置的角色权限,也可以自定义角色权限。
Mongo内置用户角色见:https://docs.mongodb.com/manual/core/security-built-in-roles/
自定义用户角色见:https://docs.mongodb.com/manual/core/security-user-defined-roles/
账户管理员账号UserAdmin只有管理账户和角色的权限。若UserAdmin企图执行其他操作,如从test数据库中的foo集合读取数据,MongoDB会返回一个error。
以下是创建一个账户的操作
> use test > db.createUser( { user: "myTester", pwd: "xyz123", roles: [ { role: "readWrite", db: "test" }, { role: "read", db: "reporting" } ] } )
7. 使用myTester账户登陆
连接时认证
mongo --port 27017 -u "myTester" -p "xyz123" --authenticationDatabase "test"
连接后认证
mongo --port 27017 > use test > db.auth("myTester", "xyz123" )
myTester用户往集合插入数据
> db.foo.insert( { x: 1, y: 1 } )