开启 MongoDB 服务后,默认是没有权限验证的。直接通过 IP 加端口就可以远程访问数据库,并对 数据库进行任意操作。下面介绍一下如何开启 docker 中 MongoDB 的权限认证。
安装完 MongoDB 服务后默认有一个 admin 数据库,此时 admin 数据库是空的,没有记录任何权 限相关的信息。当 admin.system.users 一个用户都没有时,即使 MongoDB 启动时添加了--auth 参数,如果没有在 admin 数据库中添加用户,此时不进行任何认证还是可以做任何操作(不管是否以 --auth 参数启动),直到在 admin.system.users 中添加一个用户。因此要开启 MongoDB 的权限 认证需要满足两点条件: admin.system.users 中添加用户 MongoDB 以--auth 启动
实践进入相应的 docker 容器: docker exec -it mongo /bin/bash
进入 MongoDB 交互式命令行并切换到 admin 数据库 mongo use admin MongoDB 自带一个数据库叫 admin,可以在这个数据库中创建管理员账号。 所有创建的用户都会存储在 system.users 集合中。 db.getCollectionNames() // [ "system.users", "system.version" ] 创建管理员,赋予 root 权限 db.createUser({user:"admin",pwd:"123456",roles:[{role: 'root', db: 'admin'}]}) /*Successfully added user: { "user" : "admin", "roles" : [ {"role" : "root", "db" : "admin" }]}*/
认证当前用户管理员 db.auth('admin', ‘123456’) // 返回 1 就是认证成功
创建普通用户 切换到目标数据库: use iot 创建用户角色,并赋予读写权限
db.createUser({ user: 'iot', pwd: '123456', roles: [{role: 'readWrite', db: 'iot'}] })
/*Successfully added user: { "user" : "iot", "roles" : [ {"role" : "readWrite", "db" : "iot" }]}*/
认证试试: db.auth('iot', '123456') 注意: 用户只能在创建该用户时所在的数据库进行认证。认证成功后,就可以对该数据库执行权限范围内的 操作。
exit mongo 127.0.0.1/iot -u iot -p db.iot.insert({"name":"菜鸟"})
连接数据库时,指定用户和密码 mongodb_uri = 'mongodb://iot:123456@localhost:27017/iot?authSource=iot&authMechanism=SCRA M-SHA-1' MongoDB
连接 URL 可以参考: https://api.mongodb.com/python/current/examples/authentication.html 其他命令: 删除用户:db.dropUser('username') MongoDB 目前内置了 7 个角色。 数据库用户角色:read、readWrite; 数据库管理角色:dbAdmin、dbOwner、userAdmin; 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager; 备份恢复角色:backup、restore; 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、 dbAdminAnyDatabase 超级用户角色:root;这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、 userAdmin、userAdminAnyDatabase) 内部角色:__system 这些角色对应的作用如下: Read:允许用户读取指定数据库 readWrite:允许用户读写指定数据库 dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profile userAdmin:允许用户向 system.users 集合写入,可以找指定数据库里创建、删除和管理用户 clusterAdmin:只在 admin 数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。 readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限 readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限 userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限 dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限。 root:只在 admin 数据库中可用。超级账号,超级权限
修改密码
方法1:db.changeUserPassword("usertest","changepass");
方法2:db.updateUser("usertest",{pwd:"changepass1"});
修改权限
db.updateUser("usertest",{roles:[ {role:"read",db:"testDB"} ]})
注:updateuser它是完全替换之前的值,如果要新增或添加roles而不是代替它
则使用方法: db.grantRolesToUser() 和 db.revokeRolesFromUser()
db.grantRolesToUser("usertest", [{role:"readWrite", db:"testDB"},{role:"read", db:"testDB"}]) # 修改权限
db.revokeRolesFromUser("usertest",[{role:"read", db:"testDB"}]) # 删除权限
删除用户db.dropUser('usertest')