【发布时间】: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/…