使用 Hibernate OGM 的 MongoDb 身份验证

Posted

技术标签:

【中文标题】使用 Hibernate OGM 的 MongoDb 身份验证【英文标题】:MongoDb authentication using Hibernate OGM 【发布时间】:2017-06-13 02:59:22 【问题描述】:

我可以使用 shell 命令在我的 mongodb 上进行身份验证:

#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:无法启动数据存储提供程序 原因:org.hibernate.HibernateException:OGM001214:无法连接到 MongoDB 实例:在等待与 ReadPreferenceServerSelectorreadPreference=primary 匹配的服务器时超时 30000 毫秒。集群状态的客户端视图是 type=UNKNOWN, servers=[address=mongo:27017, type=UNKNOWN, state=CONNECTING, exception=com.mongodb.MongoSecurityException: Exception authenticationing MongoCredentialmechanism=SCRAM-SHA-1, userName='user', source='lvdb', password=,mechanicalProperties=,由 com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' 引起在服务器 mongo:27017 上。完整的响应是 \"ok\" : 0.0, \"errmsg\" : \"Authentication failed.\", \"code\" : 18, \"codeName\" : \"AuthenticationFailed\" ] 原因:com.mongodb.MongoTimeoutException:在等待与 ReadPreferenceServerSelectorreadPreference=primary 匹配的服务器时,在 30000 毫秒后超时。集群状态的客户端视图是 type=UNKNOWN, servers=[address=mongo:27017, type=UNKNOWN, state=CONNECTING, exception=com.mongodb.MongoSecurityException: Exception authenticationing MongoCredentialmechanism=SCRAM-SHA-1, userName='user', source='lvdb', password=,mechanicalProperties=,由 com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' 引起在服务器 mongo:27017 上。完整的响应是 \"ok\" : 0.0, \"errmsg\" : \"Authentication failed.\", \"code\" : 18, \"codeName\" : \"AuthenticationFailed\" ] "

【问题讨论】:

这个问题现在已经在master上修复了,下一个版本应该可以工作 【参考方案1】:

Hibernate OGM 当前使用数据库名称作为身份验证数据库。这是一个错误,我正在处理它。

在您的示例中(顺便说一句,一切似乎都是正确的),您想要连接到 “lvdb” db,但您在“admin”数据库中定义了用户。 Hiebernate OGM 实际上是在“lvdb”数据库中寻找用户。

更新:这个问题现在已经在最新的稳定版本(5.1.0.Final)中得到修复,你可以使用属性hibernate.ogm.mongodb.authentication_database来选择认证数据库的名称(@987654322 @ 是默认名称)。

【讨论】:

以上是关于使用 Hibernate OGM 的 MongoDb 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 Hibernate OGM 的 MongoDb 身份验证

Hibernate OGM聚合查询的结果

Hibernate OGM映射本地查询的@Embeddable对象

Hibernate OGM 映射本机查询的@Embeddable 对象

休眠 OGM Neo4j (5.0) Wildfly 10 错误。提供者 org.hibernate.ogm.service.impl.OgmIntegrator 不是子类型

Spring Data MongoDB 和 Hibernate OGM for MongoDB 有啥区别?