MongoDB 显示当前用户。

78

如何在mongo shell中展示当前登录的用户?这很有用,因为当你在交互式shell中时,可以更改已登录用户,例如db.auth("newuser", "password"),容易混淆。以下是一个接受答案的更新,我将提示符更改为包括用户、连接和数据库:

编辑您家目录下的.mongorc.js文件。

function prompt() {
    var username = "anon";
    var user = db.runCommand({connectionStatus : 1}).authInfo.authenticatedUsers[0];
    var host = db.getMongo().toString().split(" ")[2];
    var current_db = db.getName();

    if (!!user) {
        username = user.user;
    }

    return username + "@" + host + ":" + current_db + "> ";
}

结果:

MongoDB shell version: 2.4.8
connecting to: test

anon@127.0.0.1:test> use admin
switched to db admin

anon@127.0.0.1:admin> db.auth("a_user", "a_password")
1

a_user@127.0.0.1:admin>

你的代码可能会显示错误的用户,例如:在已进行身份验证之后,更改db并以另一个用户进行身份验证。在这种情况下,“connectionStatus.authInfo.authenticatedUsers”数组将包含两个用户。由于您的代码始终读取第一个数组元素,因此可能会显示错误的用户。 顺便说一句,使用“最后”的数组条目并不完美,因为当您切换回已经进行身份验证并重新进行身份验证的db时,相应的数组元素将被“替换”,因此它保留了其前一个数组位置,因此最后一个数组元素也可能是不正确的。 - Kay
非常有用,即使考虑到上面的评论(用户可能是错误的)。我已经添加了以下代码:如果(host === undefined)host = 'localhost' - Keith Whittingham
1个回答

140

connectionStatus 命令显示已认证的用户(如果有的话,还会显示其他一些数据):

db.runCommand({connectionStatus : 1})

这将导致类似以下的结果:

{
    "authInfo" : {
            "authenticatedUsers" : [
                    {
                            "user" : "aa",
                            "userSource" : "test"
                    }
            ]
    },
    "ok" : 1
}

如果你从shell连接,那么这基本上是当前用户。

您还可以通过在操作系统用户主目录下的.mongorc.js文件中覆盖prompt函数并添加用户名来自定义提示符。大致如下:

prompt = function() {
    user = db.runCommand({connectionStatus : 1}).authInfo.authenticatedUsers[0]
    if (user) {
        return "user: " + user.user + ">"
    }
    return ">"
}       

一个例子:

$ mongo -u "cc" -p "dd"
MongoDB shell version: 2.4.8
connecting to: test
user: cc>db.auth("aa", "bb")
1
user: aa>

太好了。非常详细和有帮助。额外的提示信息是很好的建议。非常感谢,干杯! - James
你的代码可能会显示错误的用户,例如:在经过身份验证后,更改数据库并作为另一个用户进行身份验证。在这种情况下,connectionStatus.authInfo.authenticatedUsers 数组将包含两个用户。由于你的代码总是读取第一个数组元素,因此可能会显示错误的用户。 顺便说一句,使用 最后一个 数组条目也不完美,因为当你切换回已经进行身份验证并重新进行身份验证的数据库时,相应的数组元素将被 替换,因此它保持其前一个数组位置,所以最后一个数组元素也可能是不正确的。 - Kay
@Kay,看起来这个(方案)不再有效了。当我尝试这个场景时,每个命令都会出现一个错误“已认证太多用户”。请参见认证方法 - Wernfried Domscheit
@WernfriedDomscheit 您说得对,这个确实改变了 - MongoDB肯定在不断发展。 - Kay
如果您想重用默认提示,可以使用函数defaultPrompt(),例如return "user: " + user.user + " " + defaultPrompt(),它会提示当前用户和副本集名称+状态。 - Wernfried Domscheit
这真是救了我一命,我第一次登录使用 Helm Chart 构建的 Bitnami Mongo 集群时,无法运行命令,因为我没有“认证”。由于 Helm Charts 正在构建东西,很难确定是否有用户。在使用 use admin 切换到管理员数据库后,我运行了这个命令,并成功地发现了问题所在——没有用户。谢谢! - Mike Kellogg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接