MongoDB,如何使用密码上带有特殊字符“@”的 uri 连接

Zha*_* Yi 6 mongodb

我有 au 用户,其密码中包含特殊字符。密码是123@456。我试图逃避这个角色,但仍然不起作用。下面是我尝试过的方法:

$ mongo mongodb://user5:123%40456@localhost:28017/admin
MongoDB shell version v3.4.0
connecting to: mongodb://user5:123%40456@localhost:28017/admin
2017-02-14T12:11:47.571+1100 E QUERY    [main] Error: Authentication failed. :
connect@src/mongo/shell/mongo.js:234:13
@(connect):1:6
exception: connect failed
Run Code Online (Sandbox Code Playgroud)

我可以使用以下方式进行连接:

$ mongo mongodb://localhost:28017/admin -u user5 -p 123@456
MongoDB shell version v3.4.0
connecting to: mongodb://localhost:28017/admin
MongoDB server version: 3.4.0
Run Code Online (Sandbox Code Playgroud)

但我正在寻找一种通过 URI 进行连接的方法。如何@在 MongoDB 中使用该字符作为 URI 连接中的密码?这样,我可以使用相同的 URI 进行 shell 连接和驱动程序连接。

McG*_*ady 1

恐怕您无法使用密码中包含特殊字符的连接 URI@连接 MongoDB 。

\n\n

因为据我所知,Mongo 使用标准正则表达式来支持连接字符串 URI。我尝试阅读 mongo shell 和驱动程序代码,找到了原因。您可以从 github 看到连接部分解析器部分。

\n\n

这是mongo-cxx-driver中的部分代码。

\n\n
namespace {\nconst char kMongoDBURL[] =\n    // scheme: non-capturing\n    "mongodb://"\n\n    // credentials: two inner captures for user and password\n    "(?:([^:]+)(?::([^@]+))?@)?"\n\n    // servers: grabs all host:port or UNIX socket names\n    "((?:(?:[^\\\\/]+|/.+.sock?),?)+)"\n\n    // database: matches anything but the chars that cannot\n    // be part of a MongoDB database name.\n    "(?:/([^/\\\\.\\\\ \\"*<>:\\\\|\\\\?]*))?"\n\n    // options\n    "(?:\\\\?(?:(.+=.+)&?)+)*";\n\n} // namespace\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们可以看到,如果你的连接URI是mongodb://user5:123@456@localhost:28017/admin,它会解析这个字符串并返回mongodb://da1:abc@而不是mongodb://da1:abc@123@

\n\n

事实上,我尝试abc^&*123使用带单引号的 mongo shell 设置用户密码并连接 MongoDB,但没有转义任何特殊字符。而且它有效。

\n\n
\xe2\x9e\x9c  mongo \'mongodb://users:abc^&*123@localhost:27017\'\nMongoDB shell version v3.4.0\nconnecting to: mongodb://users:abc^&*123@localhost:27017\nMongoDB server version: 3.4.0\nServer has startup warnings:\n2017-02-14T11:58:20.623+0800 I CONTROL  [initandlisten]\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以我认为连接 URI支持其他特殊字符而不转义它们,但不支持@密码中的字符。

\n\n

不过,你可以试试这个:

\n\n
\xe2\x9e\x9c  mongo admin -u user5 -p \'abc@123\'\nMongoDB shell version v3.4.0\nconnecting to: mongodb://127.0.0.1:27017/admin\nMongoDB server version: 3.4.0\nServer has startup warnings:\n2017-02-14T14:15:06.109+0800 I CONTROL  [initandlisten]\n
Run Code Online (Sandbox Code Playgroud)\n\n

您还可以将 MongoDB 与其他工具(如Robomongo或 pymongo)连接。他们对此非常支持。顺便说一句,我建议将密码更改为另一个不包含@字符的密码。

\n\n

希望这可以帮助。

\n\n
\n\n

更新

\n\n

查看SERVER-27997,SERVER-25059 正在跟踪该错误。

\n