As suggested by the errors you are receiving your problem appears to be with the permissions set for the user account you are using for access.
More recent versions of MongoDB from 2.4 upwards have more granular control over user roles http://docs.mongodb.org/manual/reference/user-privileges/ which may have an effect on what you are doing. In particular Mongoengine will have logic to set up indexes on the classes you are implementing and is likely trying to deploy them via ensure index. This would be a problem if the user account did not have this privilege.
Also it appears you are using a service provider for your MongoDB instances and they have likely set up some general provisions as to what the account's approved roles are. This points to your problem with querying a secondary.
Whilst you can set up your connection to read from a secondary after you have resolved your permission issues, it is probably not really what you want. The general use case is that you are sure it is absolutely okay to not get the latest data as it is likely the secondary nodes are lagging behind.
Probably what you really need to do is look into what is causing the locking issues. Considering your use of Mongoengine a likely cause is here and you might need to look at background index building. Also this is a very good reason why reading from a secondary would be a bad idea until the next version of MongoDB is released and installed by your provider. http://docs.mongodb.org/manual/tutorial/build-indexes-on-replica-sets