美文网首页
mongodb认证问题

mongodb认证问题

作者: 心情后花园 | 来源:发表于2018-06-10 18:18 被阅读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: 文中的数据库名称,用户名称可能不一致,毕竟自己在试验过程中创建了不少无用的。但是知道过程就好

    相关文章

      网友评论

          本文标题:mongodb认证问题

          本文链接:https://www.haomeiwen.com/subject/ulfqeftx.html