首先,mongo默认登录不需要密码
登录完之后,
1.创建 admin
角色:userAdminAnyDatabase (这是一个账号管理员的角色)
admin用户用于管理账号,不能进行关闭数据库等操作,目标数据库是admin
1.另起一个终端,运行下列命令
mongo --port 27017
use admin
db.createUser(
{
user: "adminUser",
pwd: "adminPass",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
管理员创建成功,现在拥有了用户管理员
用户名:adminUser
密码:adminPass
2.创建root
创建完admin管理员,创建一个 超级管理员 root 角色:root
root角色用于 关闭数据库 db.shutdownServer()
db.createUser({user: "root",pwd: "123456",roles: [ { role: "root", db: "admin" } ]})
3.创建用户自己的数据库的角色
当账号管理员和超级管理员,可以为自己的数据库创建用户了
(坑)这时候一定,一定要切换到所在数据库上去创建用户,不然创建的用户还是属于admin。
use position
db.createUser({user: "position",pwd: "123456",roles: [ { role: "dbOwner", db: "position" } ]})
4.查看用户
创建完或者删完用户,可以查看当前的用户列表
db.system.users.find()
或者
show users
5.删除用户
删除用户必须由账号管理员来删,所以,切换到admin角色
use admin
db.auth("admin","123456")
删除单个用户
db.system.users.remove({user:"XXXXXX"})
删除所有用户
db.system.users.remove({})
2.2 Mongodb 用户验证登陆
启动带访问控制的 Mongodb
新建终端
mongod --auth --port 27017 --dbpath /data/db1
现在有两种方式进行用户身份的验证
第一种 (类似 MySql)
客户端连接时,指定用户名,密码,db名称
mongo --port 27017 -u "adminUser" -p "adminPass" --authenticationDatabase "admin"
第二种
客户端连接后,再进行验证
mongo --port 27017
use admin
db.auth("adminUser", "adminPass")
// 输出 1 表示验证成功
2.3 创建普通用户
过程类似创建管理员账户,只是 role 有所不同
use foo
db.createUser(
{
user: "simpleUser",
pwd: "simplePass",
roles: [ { role: "readWrite", db: "foo" },
{ role: "read", db: "bar" } ]
}
)
现在我们有了一个普通用户
用户名:simpleUser
密码:simplePass
权限:读写数据库 foo, 只读数据库 bar。
注意
NOTE
WARN
use foo
表示用户在 foo 库中创建,就一定要 foo 库验证身份,即用户的信息跟随随数据库。比如上述 simpleUser 虽然有 bar 库的读取权限,但是一定要先在 foo 库进行身份验证,直接访问会提示验证失败。
use foo
db.auth("simpleUser", "simplePass")
use bar
show collections
还有一点需要注意,如果 admin 库没有任何用户的话,即使在其他数据库中创建了用户,启用身份验证,默认的连接方式依然会有超级权限
2.4 内建角色
- Read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
- userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
- root:只在admin数据库中可用。超级账号,超级权限
2.5 URI 形式的访问
生产中常用 URI 形式对数据库进行连接
mongodb://your.db.ip.address:27017/foo
添加用户名密码验证
mongodb://simpleUser:simplePass@your.db.ip.address:27017/foo
参考链接
结语
在使用数据库的过程中,一定要注意安全风险,由于 Mongodb 的默认配置,使得数据库有入侵风险,应该予以防范。
mongodb密码和传统数据如mysql等有些区别:
- mongodb的用户名和密码是基于特定数据库的,而不是基于整个系统的。所有所有数据库db都需要设置密码
mongodb设置管理用户和密码:
show dbs
在mongodb新版本里并没有admin数据库,但是并不妨碍第2步操作。use admin
进入admin数据库- 创建管理员账户
db.createUser({ user: "useradmin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
mongodb中的用户是基于身份role的,该管理员账户的 role是 userAdminAnyDatabase。 ‘userAdmin’代表用户管理身份,’AnyDatabase’ 代表可以管理任何数据库。 - 验证第3步用户添加是否成功
db.auth("useradmin", "adminpassword")
如果返回1,则表示成功。
exit
退出系统
db.auth()
方法理解为 用户的验证功能 - 修改配置
sudo vi /etc/mongod.conf
找到#security:
取消注释,修改为:security:
authorization: enabled #注意缩进,缩进参照配置文件其他配置。缩进错误可能第6步重启不成功。
- 重启mongodb
sudo service mongod restart
- 进入mongodb,用第3步的 管理员账户登录,用该账户创建其他数据库管理员账号
use admin
db.auth("useradmin", "adminpassword")
- 新建你需要管理的mongodb 数据的账号密码。
use yourdatabase
db.createUser({ user: "youruser", pwd: "yourpassword", roles: [{ role: "dbOwner", db: "yourdatabase" }] })
rote:dbOwner 代表数据库所有者角色,拥有最高该数据库最高权限。比如新建索引等
-
新建数据库读写账户
use yourdatabase
db.createUser({ user: "youruser2", pwd: "yourpassword2", roles: [{ role: "readWrite", db: "yourdatabase" }] })
该用户用于该数据的读写,只拥有读写权限。
- 现在数据的用户名和密码就建好了。
可以使用:mongodb://youruser2:yourpassword2
@localhost/yourdatabase
来链接