【问题标题】:Add user to mongodb with mongodb go driver使用 mongodb go 驱动程序将用户添加到 mongodb
【发布时间】:2020-06-11 08:03:11
【问题描述】:

我想在 mongodb 中添加一个 mongo 用户。我尝试了以下方法:

import (
    "context"
    "fmt"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "log"
    "os"
    "time"
)
type User struct {
    User  string `json:"user"`
    Db    string `json:"db"`
    Roles []Role`json:"roles"`
    PasswordDigestor string `json:"passwordDigestor"`
    Pwd string `json:"pwd"`
}

type Role struct {
    Role string `json:"role"`
    Db   string `json:"db"`
}
func CreateUser() {
    client, err := mongo.NewClient(options.Client().ApplyURI(fmt.Sprintf("mongodb://%s:%s@%s/test?authSource=%s&replicaSet=%s",
        mongoConf.user,mongoConf.password,mongoConf.host,mongoConf.authDB,mongoConf.replicaset)))
    if err != nil {
        log.Fatal(err)
    }
    ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
    err = client.Connect(ctx)
    if err != nil {
        log.Fatal(err)
    }
    defer client.Disconnect(ctx)

    //pass :=  password(8)
    pass := "Test123!"
    if _, err = client.Database("admin").Collection("system.users").InsertOne(context.Background(),User{
        User: "test",
        Db:   "admin",
        Roles: []Role{
            {Role: "readWriteAnyDatabase",
                Db: "admin",
            },
        },
        PasswordDigestor: "server",
        Pwd:              pass,
    }); err != nil {
        panic(err)
    }

}

但这不起作用。对于 shell,db.createUser() 没有问题。但是我应该怎么做呢?我能够列出system.users 表中的所有用户。当我将这样的用户插入数据库时​​,它的工作没有问题,但无法使用创建的用户登录。

编辑: runnint db.createUser:

function (userObj, writeConcern) {
        var name = userObj["user"];
        var cmdObj = {createUser: name};
        cmdObj = Object.extend(cmdObj, userObj);
        delete cmdObj["user"];

        this._modifyCommandToDigestPasswordIfNecessary(cmdObj, name);

        cmdObj["writeConcern"] = writeConcern ? writeConcern : _defaultWriteConcern;

        var res = this.runCommand(cmdObj);

        if (res.ok) {
            print("Successfully added user: " + getUserObjString(userObj));
            return;
        }

        if (res.errmsg == "no such cmd: createUser") {
            throw Error("'createUser' command not found.  This is most likely because you are " +
                        "talking to an old (pre v2.6) MongoDB server");
        }

        if (res.errmsg == "timeout") {
            throw Error("timed out while waiting for user authentication to replicate - " +
                        "database will not be fully secured until replication finishes");
        }

        throw _getErrorWithCode(res, "couldn't add user: " + res.errmsg);
    }

【问题讨论】:

  • 如果你在 shell 中运行db.createUser(就像没有括号的那样),它会显示它实际运行的代码。它实际上是使用runCommand()。查看stackoverflow.com/questions/53885925/…

标签: mongodb go


【解决方案1】:

感谢@Joe,我可以解决运行以下命令的问题:

r := client.Database(dbName).RunCommand(context.Background(),bson.D{{"createUser", userName},
    {"pwd", pass}, {"roles", []bson.M{{"role": roleName,"db":roldeDB}}}})
if r.Err() != nil {
    panic(r.Err())
}

【讨论】:

    猜你喜欢
    • 2017-03-28
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2021-05-19
    相关资源
    最近更新 更多