Description
The mongoengine documentation indicates that the mongoengine.connect()
method takes keyword parameters username
and password
and returns a pymongo.connection.Connection
object. While not explicitly stated I have an expectation that the username and password passed into connect() are authenticated immediately and that the pymongo.connection.Connection
object returned is authenticated. The unexpected behavior is that it is not authentication! If authentication is required and you attempt to list the collections you'll receive the following exception:
pymongo.errors.OperationFailure: database error: not authorized for query on example_db.system.namespaces
Authentication doesn't occur until mongoengine.connection.get_db()
is actually called although the mongoengine.connect()
method has everything it needs to attempt authentication. Another downside of this is that the authentication error isn't explicit with the call to connect(). It will fail some time later when get_db()
is called. Here is a reproducer snippet:
import mongoengine
name="example_db"
connection_kwargs={'username': 'mongodb_user', 'max_pool_size': 10, 'host': 'localhost', 'password': 'xxxxxxxx', 'port': 27017}
con = mongoengine.connect(name, **connection_kwargs)
con.example_db.collection_names()
You'll notice that this doesn't occur for normal mongoengine use, but this is still a problem. This problem affects users who are transitioning from using PyMongo directly to mongoengine. The first step in that process is to convert the connection so that it is managed using mongoengine instead of PyMongo. As soon as this happens username and password authentication will stop working for any existing code that uses the pymongo.connection.Connection
returned from mongoengine.connect().
This problem affects 0.7.10+ all the way up to the latest release and master.