问题来源
刚装好的mongo,准备登陆进去测一把的,结果就给我报这个错,鄙人是新手,还不太清楚这个,现学一下~
Mongo的身份验证
在上一篇安装mongo的博客中(https://www.cnblogs.com/tuhooo/p/9673685.html),提供了一个简单的配置文件,其中有个选项是
auth=true
这里的意思是开启身份验证,有用户,密码,角色,权限之类的东西,如果把auth设为false的话,那么mongo就相当于裸奔了,谁都可以连进来。如果服务器安全性挺高的,裸奔倒也不是问题。但是现在的版本还是推荐把这个auth给打开。
认证、授权和用户
身份认证:验证用户的身份,你是谁
授权:判定用户在通过了身份验证的数据库上可以进行那些操作,比如读,写,只读,只写等
auth=true会禁止对数据库的匿名访问。
Mongo中用户的信息在system.users集合中,改集合存在于管理数据库中(我这里的是admin),它存储了用户id,密码和创建该集合所面向的数据库以及对用户授权的权限。
在打印的用户信息的第一行中,"user" : "tuhooo", "db" : "admin",表示了tuhooo这个用户及其关联的数据库"admin",它们两个唯一标识了Mongo中的一个用户。如果两个用户具有相同名称,但是关联到了不同的数据库,那么它们被认为是两个不同的用户。
在用户信息的倒数第二行:"roles" : [ { "role" : "read", "db" : "admin" }, { "role" : "userAdminAnyDatabase", "db" : "admin" } ]表明了tuhooo在这个用户可以有不同数据库的不同权限(这里只有一个库,因为我还没来得及建测试库)。如果两个用户具有相同的名称但是关联到了不同的数据库,那么它们被认为是两个不同的用户。
小结:
用户名和关联的数据库唯一标识了Mongo中的一个用户。
一个用户可以在不同数据库中具有不同授权级别的多个角色。
Mongo中的角色
Mongo中可用的角色有以下:
read
提供了对指定数据库所有集合的只读访问。
readWrite
提供了指定数据库中对任意集合的读写访问。
dbAdmin
用户可以在指定数据库中执行管理操作,使用ensureIndex、dropIndexes、reIndex、indexStats管理索引、重命名集合、创建集合等。
userAdmin
用户可以对指定数据库的system.users集合进行readWrite操作。它还启用了对已有用户的权限进行修改或者创建用户的功能,实际上指定了数据库的超级用户角色。
clusterAdmin
使得用户可以对修改或显示与整个系统有关的信息的管理操作授予访问权限。clusterAdmin只适用于管理数据库。
readAnyDatabase
使得用户可以读取Mongo环境中的任意数据库。
readWriteAnyDatabase
类似于readWrite,只不过它适用于所有数据库。
userAdminAnyDatabase
类似于userAdmin,只不过它适用于所有数据库。
dbAdminAnyDatabase
类似于dbAdmin,只不过它适用于所有数据库。
其他角色
从2.6版本开始,一个用户管理员还可以通过提供集合级别以及命令级别的访问权限来创建遵循最小权限策略的用户定义的角色。用户定义的角色仅作用于创建它的数据库中,并且被数据库和角色名称的组合唯一标识。所有用户定义的角色都被存储在system.roles集合中。
几个常见操作
登陆mongo
上图是我登陆的过程,刚用mongo连接进去了,然后直接:
db.auth("tuhooo", "123456")
居然给我报错,只有切换到admin库,然后在这个库下面才能做登陆。
切记切换到admin进行登陆操作。
创建用户并授权
// 客户端连接 $ mongo // 切换到admin库 > use admin // 创建用户 > db.createUser( { user: "myUserAdmin", pwd: "abc123", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } ) // 登陆, 只有登陆后才能进行其他操作 > db.auth("myUserAdmin", "abc123") // 授予角色, 可以根据前面的介绍以及个人需要来授予 > db.grantRolesToUser("myUserAdmin", [ { role: "read", db: "admin" } ]) // 查看状态 > db.stats()
以上就是这样了~