mongodb认证问题

2018-06-10  本文已影响0人  心情后花园

在自己搭建测试环境的时候,创建用户,创建数据库,打开认证,认证登陆,然后发现认证登陆的时候不能登陆上去,打开日志,发现了以下错误!

// 登陆命令
/*
 * 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: 文中的数据库名称,用户名称可能不一致,毕竟自己在试验过程中创建了不少无用的。但是知道过程就好

上一篇下一篇

猜你喜欢

热点阅读