2017-01-27 4 views
1

Я могу проверить подлинность на моем MongoDB с помощью команды оболочки:аутентификации MongoDb с использованием Hibernate OGM

#mongo -u user -p pwd --authenticationDatabase admin 
MongoDB shell version v3.4.1 
connecting to: mongodb://127.0.0.1:27017 
MongoDB server version: 3.4.1 
> use admin 
switched to db admin 
> show users 
{ 
     "_id" : "admin.ladmin", 
     "user" : "ladmin", 
     "db" : "admin", 
     "roles" : [ 
       { 
         "role" : "userAdminAnyDatabase", 
         "db" : "admin" 
       } 
     ] 
} 
{ 
     "_id" : "admin.living", 
     "user" : "user", 
     "db" : "admin", 
     "roles" : [ 
       { 
         "role" : "readWrite", 
         "db" : "lvdb" 
       } 
     ] 
} 

Я также был в состоянии проверить подлинность на него с помощью драйвера Java:

List<ServerAddress> seeds = new ArrayList<ServerAddress>(); 
seeds.add(new ServerAddress(this.configurationResources.getMongodbServer(), this.configurationResources.getMongodbPort())); 

List<MongoCredential> credentials = new ArrayList<MongoCredential>(); 
credentials.add(
    MongoCredential.createScramSha1Credential(
     this.configurationResources.getMongodbUsername(), 
     this.configurationResources.getMongodbAuthenticationDatabase(), 
     this.configurationResources.getMongodbPassword().toCharArray() 
    ) 
); 

this.mongoClient = new MongoClient(seeds, credentials); 

В настоящее время я участвую в проекте, который я хочу использовать Hibernate OGM. Я установил persistence.xml файл:

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="mongo" transaction-type="JTA"> 
     <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider> 

     <class>com.living.persistence.entities.User</class> 

     <properties> 
      <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" /> 
      <property name="hibernate.ogm.datastore.provider" value="org.hibernate.ogm.datastore.mongodb.impl.MongoDBDatastoreProvider"/> 
      <property name="hibernate.ogm.datastore.database" value="lvdb"/> 
      <property name="hibernate.ogm.datastore.host" value="mongo"/> 
      <property name="hibernate.ogm.datastore.port" value="27017"/> 
      <property name="hibernate.ogm.datastore.username" value="user"/> 
      <property name="hibernate.ogm.datastore.password" value="pwd"/> 
      <property name="hibernate.ogm.mongodb.authentication_mechanism" value="SCRAM_SHA_1"/> 

      <property name="hibernate.ogm.mongodb.connection_timeout" value="5000"></property> 
      <property name="hibernate.ogm.datastore.document.association_storage" value="IN_ENTITY"></property> 
      <property name="hibernate.ogm.mongodb.association_document_storage" value="GLOBAL_COLLECTION"></property> 
      <property name="hibernate.ogm.mongodb.write_concern" value="MAJORITY"></property> 
      <property name="hibernate.ogm.mongodb.read_preference" value="PRIMARY_PREFERRED"></property> 
     </properties> 
    </persistence-unit> 
</persistence> 

Как вы можете видеть, я использую SCRAM-SHA1 в качестве механизма аутентификации.

Тем не менее, я получаю это сообщение, когда я пытаюсь развернуть мое приложение:

Вызванный: org.hibernate.service.spi.ServiceException: OGM000071: Не удается запустить datatore поставщика Вызванный by: org.hibernate.HibernateException: OGM001214: невозможно подключиться к экземпляру MongoDB: время ожидания после 30000 мс при ожидании сервера, который соответствует ReadPreferenceServerSelector {readPreference = primary}. Клиентский вид состояния кластера: {type = UNKNOWN, servers = [{address = mongo: 27017, type = UNKNOWN, state = CONNECTING, exception = {com.mongb.MongoSecurityException: Исключение аутентификации MongoCredential {механизм = SCRAM-SHA-1, userName = 'user', source = 'lvdb', password =, механизмProperties = {}}}, вызванный {com.mongodb.MongoCommandException: сбой команды с ошибкой 18: «Ошибка аутентификации». на сервере mongo: 27017. Полный ответ: {\ "ok \": 0.0, \ "errmsg \": \ "Ошибка аутентификации. \", \ "Code \": 18, \ "codeName \": \ "AuthenticationFailed \"}}}] Вызвано: com.mongodb.MongoTimeoutException: Сработало после 30000 мс в ожидании сервера, который соответствует ReadPreferenceServerSelector {readPreference = primary}. Клиентский вид состояния кластера: {type = UNKNOWN, servers = [{address = mongo: 27017, type = UNKNOWN, state = CONNECTING, exception = {com.mongb.MongoSecurityException: Исключение аутентификации MongoCredential {механизм = SCRAM-SHA-1, userName = 'user', source = 'lvdb', password =, механизмProperties = {}}}, вызванный {com.mongodb.MongoCommandException: сбой команды с ошибкой 18: «Ошибка аутентификации». на сервере mongo: 27017. Полный ответ: {\ "ok \": 0.0, \ "errmsg \": \ "Ошибка аутентификации. \", \ "Code \": 18, \ "codeName \": \ "AuthenticationFailed \"}}}] «}}

+0

Эта проблема теперь исправлена ​​для мастера, и следующая версия должна работать – Davide

ответ

0

Hibernate OGM в настоящее время использует имя базы данных в качестве базы данных аутентификации. Это ошибка, я работаю над этим прямо сейчас.

В вашем примере (все кажется правильным, кстати) вы хотите подключиться к «lvdb» дб, но вы определили пользователя в базе данных «администратора» Hiebernate OGM фактически ищет пользователя в базе данных «lvdb»

UPDATE:.. Thi s проблема теперь исправлена ​​в последней стабильной версии (5.1.0.Final), вы можете использовать свойство hibernate.ogm.mongodb.authentication_database для выбора имени базы данных аутентификации (admin - это имя по умолчанию).

Смежные вопросы