Я пытаюсь создать базу данных аутентификации в MongoDB 2.6 с помощью java-драйвера v 2.12. В частности, мне нужно создать пользователя, получающего доступ к коллекции admin. Любое предложение? Благодарю.
Здесь мое решение:
MongoClient mcAdmin = new MongoClient(
configuration.getServerAddresses(),
Arrays.asList(MongoCredential.createMongoCRCredential(
MONGODB_ADMIN_USERNAME, "admin",
MONGODB_ADMIN_PASSWORD.toCharArray())));
try {
mcAdmin.setWriteConcern(WriteConcern.JOURNALED);
DB db = mcAdmin.getDB(userDbName);
BasicDBObject commandArguments = new BasicDBObject();
commandArguments.put("user", userUsername);
commandArguments.put("pwd", userPassword);
String[] roles = { "readWrite" };
commandArguments.put("roles", roles);
BasicDBObject command = new BasicDBObject("createUser",
commandArguments);
db.command(command);
} finally {
mcAdmin.close();
}
Выполнение этого в Java-коде не самый лучший способ сделать это, и за исключением очень редких случаев использования (написания приложения администратора для MongoDB) даже один я бы настоятельно советовал.
Прежде всего, вашему приложению потребуются чрезвычайно высокие привилегии, а именно userAdminAnyDatabase
или userAdmin
в базе данных admin, которая более или менее предоставляет те же права: создание суперпользователя по своему userAdmin
. Другими словами: этот код будет представлять собой высокий риск для безопасности.
Предоставление ролей и прав в базе данных является административной задачей и по уважительным причинам должно быть отделено от приложения, доступного произвольным пользователям.
Активация аутентификации от клиента просто невозможна. Экзамен mongod должен быть запущен с включенной аутентификацией. Кроме того, вам нужно будет сохранить, чтобы создать пользователя с указанными ролями, прежде чем вы сможете управлять своим приложением. Проблема: вам нужно будет где-то хранить пароль для этого пользователя. Если вы его не зашифруете, вы в основном храните самый мощный пароль для своих баз данных и кластера MongoDB в открытом виде. И если вы зашифруете его, вы должны передать ключ для дешифрования в свое приложение в какой-то момент безопасным образом. И все это, чтобы разбить лучшие практики ("Разделение забот")?