我使用以下说明为mongo创建了管理员用户:
http://docs.mongodb.org/manual/tutorial/add-user-administrator/
从mongo客户端看起来我可以进行身份验证:
> use admin
switched to db admin
> db.auth('admin','SECRETPASSWORD');
1
>
但我不能以任何其他方式联系。例如:
mongo -u admin -p SECRETPASSWORD
给出错误:
JavaScript执行失败:错误:18 {code:18,ok:0.0,errmsg:“auth failed”}在src / mongo / shell / db.js:L228
我在etc / mongod.conf中有auth = true。
我错过了什么?
答案 0 :(得分:84)
身份验证在数据库级别进行管理。当您尝试使用数据库连接到系统时,mongo实际上会检查您在集合<database>.system.users
中提供的凭据。因此,基本上当您尝试连接到“test”时,它会在test.system.users
中查找凭据并返回错误,因为它无法找到它们(因为它们存储在admin.system.users
中)。拥有从所有数据库读取和写入的权利并不意味着您可以直接连接到它们。
您必须先连接到保存凭据的数据库。尝试:
mongo admin -u admin -p SECRETPASSWORD
有关详细信息,请查看此http://docs.mongodb.org/manual/reference/privilege-documents/
答案 1 :(得分:62)
我也收到了这个错误,我需要的是指定存储用户身份验证数据的数据库:
mongo -u admin -p SECRETPASSWORD --authenticationDatabase admin
2017年11月18日更新:
mongo admin -u admin -p
是一个更好的解决方案。 Mongo将提示您输入密码,这样您就不会将明文密码放入shell历史记录中,这只是一种非常糟糕的安全措施。
答案 2 :(得分:36)
您可能需要升级mongo shell。我本地有mongo shell版本2.4.9,我尝试连接到mongo 3数据库时遇到此错误。将shell版本升级到3解决了这个问题。
答案 3 :(得分:27)
我知道这看似显而易见但我还必须在u / n和p / w之前使用单引号
mongo admin -u'user'-p'password'
答案 4 :(得分:16)
在MongoDB 3.0中,它现在支持多种身份验证机制。
如果您使用新用户创建了新的3.0数据库,则可以使用SCRAM-SHA-1创建它们。
所以你需要一个能够进行身份验证的驱动程序:
http://docs.mongodb.org/manual/release-notes/3.0-scram/#considerations-scram-sha-1-drivers
如果您使用现有用户数据从2.x升级数据库,他们仍将使用MONGODB-CR,并且必须升级用户身份验证数据库:
http://docs.mongodb.org/manual/release-notes/3.0-scram/#upgrade-mongodb-cr-to-scram
现在,需要使用SCRAM-SHA-1创建的用户连接到MongoDB 3.0,以指定身份验证数据库(通过命令行mongo客户端),并使用其他机制(如果使用驱动程序)。
$&GT; mongo -u USER -p PASSWORD --authenticationDatabase admin
在这种情况下,&#34; admin&#34;数据库,也是默认用于验证。
答案 5 :(得分:13)
出现问题是,通过mongo docs中描述的方法创建的用户没有连接到默认数据库(test)的权限,即使该用户是使用“ userAdminAnyDatabase“和”dbAdminAnyDatabase“角色。
答案 6 :(得分:12)
这解决了我的问题:
转到终端shell并键入mongo
。
然后输入use db_name
。
然后输入:
db.createUser(
{
user: "mongodb",
pwd: "dogmeatsubparflavour1337",
roles: [ { role: "dbOwner", db: "db_name" } ]
}
)
还可以尝试:db.getUsers()
快速样本:
const MongoClient = require('mongodb').MongoClient;
// MongoDB Connection Info
const url = 'mongodb://mongodb:dogmeatsubparflavour1337@stackoverflow.com:27017/?authMechanism=DEFAULT&authSource=db_name';
// Additional options: https://docs.mongodb.com/manual/reference/connection-string/#connection-string-options
// Use Connect Method to connect to the Server
MongoClient.connect(url)
.then((db) => {
console.log(db);
console.log('Casually connected correctly to server.');
// Be careful with db.close() when working asynchronously
db.close();
})
.catch((error) => {
console.log(error);
});
答案 7 :(得分:2)
这是一种特殊情况,但如果有人遇到我的问题:
在MongoHQ中,它会显示一个名为“password”的字段,但它实际上只是密码的哈希值。您必须添加新用户并将密码存储在其他地方(因为MongoHQ不会向您显示)。
答案 8 :(得分:2)
登录mongo shell的正确方法是
mongo localhost:27017 -u'uuuuu'-p'&gt; xxxxxx' - authenticationDatabase dbname
答案 9 :(得分:1)
您也可以尝试: -
mongo localhost:27017/admin -u admin -p SECRETPASSWORD
中找到它
显然, localhost 可以是其他主机, / admin 可以是已应用身份验证的其他数据库
答案 10 :(得分:0)
另一种可能性:创建用户时,您可能偶然use
正在使用admin
以外的数据库或您想要的数据库以外的数据库。您需要将--authenticationDatabase
设置为实际在其下创建用户的数据库。
mongodb
似乎在您打开外壳程序时默认将您置于test
数据库中,因此如果您无意间写了--authenticationDatabase test
而不是--authenticationDatabase admin
当您运行use
时test
正在db.createUser(...)
。
假设您有权访问运行mongodb实例的计算机,则y可以禁用/etc/mongod.conf
中的授权(注释出authorization
,该嵌套在安全性下),然后重新启动服务器,然后运行:
mongo
show users
您可能会得到像这样的东西:
{
"_id" : "test.myusername",
"user" : "myusername",
"db" : "test",
"roles" : [
{
"role" : "dbOwner",
"db" : "mydatabasename"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
请注意,db
的值等于test
。这是因为创建用户时,我没有先运行use admin
或use desiredDatabaseName
。因此,您可以使用db.dropUser("myusername")
删除用户,然后在所需的数据库下创建另一个用户,如下所示:
use desiredDatabaseName
db.createUser(...)
希望这可以帮助处于我作为菜鸟的人。
答案 11 :(得分:0)
从连接到mongo服务器的位置检查客户端的mongo版本。
我的情况是,mongo服务器的版本为Mongo4.0.0,但我的客户端的版本为2.4.9。 更新mongo版本以更新mongo cli。
答案 12 :(得分:0)
mongo admin -u root -p root
mongorestore -u root --authenticationDatabase admin --db rtp_new mongo