在自己搭建测试环境的时候,创建用户,创建数据库,打开认证,认证登陆,然后发现认证登陆的时候不能登陆上去,打开日志,发现了以下错误!
// 登陆命令
/*
* username: 用户名
* password: 登陆密码
* port: mongodb 的端口,默认27017
* host: ip 地址,默认是 localhost
*/
mongo -u username -p password --port port --host host --authenticationDatabase dbName
mongo -u app-dev -p app-dev --port 53082 --host ip --authenticationDatabase app-dev
登陆命令
日志文件
错误日志:SCRAM-SHA-1 authentication failed for app-dev on app-dev2 from client ip:49106 ; UserNotFound: Could not find user app-dev@app-dev2
错误原因:mongodb的认证机制有两种,一个是 SCRAM(默认),一个是 MONGODB_CR(3.6版本被弃用),而我之前创建用户的时候,是使用了第二种认证机制,但是登陆时,mongodb使用的认证机制是 SCRAM,这就导致了认证失败这个问题。
{ "_id" : "test.app-dev", "user" : "app-dev", "db" : "test", "credentials" : { "MONGODB-CR" : "a2f8fe884bbad683ed5371e5aa111366" }, "roles" : [ { "role" : "userAdmin", "db" : "app-dev" } ] }
解决问题: 传送门
第一步是修改认证机制为 SCRAM,毕竟是官方支持。
// 1. 修改数据库的认证为 false,再去修改认证机制
vim /etc/mongo.conf
security:
authorization: disabled
// 2. 登陆
use admin;
db.adminCommand(
{authSchemaUpgrade: 1, upgradeShards: false }
);
db.system.users.find()
{ "_id" : "test.app-dev", "user" : "app-dev", "db" : "test", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "N4gMUYYkwy5wePpeoZCxFw==", "storedKey" : "91dJvSwedpfPWzjUueT3qPIsuLo=", "serverKey" : "Ilvqr2jPGRv9SDtpWuC1yXZsywo=" } }, "roles" : [ { "role" : "userAdmin", "db" : "app-dev" } ] }
credentials 证书由原先的 MONGODB-CR 变成了 SCRAM-SHA-1。
我以为这样就好了,然后又去把验证打开,重新输入登陆命令,发现还是不行,仔细看了看用户信息,发现里面的 db 是 test,而不是自己创建过的 app-dev,于是继续翻,发现是自己创建 user 的时候的问题。
原先创建用户:
创建好数据库 app-dev,再创建管理员,创建用户 user,user 的创建是在 admin 数据库下
use admin;
// 创建管理员
db.createUser({
user: "admin",
pwd: "admin",
roles: [{
role: "userAdminAnyDatabase",
db: "admin"
}]
})
// 创建用户
db.createUser({
user: "app-dev",
pwd: "app-dev",
roles: [
{role: "userAdmin", db: "app-dev"}
]
})
修正后的
use admin;
// 创建管理员
db.createUser({
user: "admin",
pwd: "admin",
roles: [{
role: "userAdminAnyDatabase",
db: "admin"
}]
})
// 创建app-dev数据库
use app-dev;
db.users.insert({ name: 'zs' })
// 创建app-dev管理员用户
db.createUser({
user: "app-admin",
pwd: "app-admin",
roles: [
{role: "userAdmin", db: "app-dev"}
]
})
// 创建 app-dev 的拥有读写权限的用户
db.createUser({
user: "app-dev",
pwd: "app-dev",
roles: [
{role: "readWrite", db: "app-dev"}
]
})
主要不同是,创建好了数据库之后,再在这个数据库中创建用户 user。
最后再用登陆命令,就成功登陆
登陆成功
PS: 文中的数据库名称,用户名称可能不一致,毕竟自己在试验过程中创建了不少无用的。但是知道过程就好
网友评论