简体   繁体   English

使用Hibernate OGM进行MongoDb身份验证

[英]MongoDb authentication using Hibernate OGM

I'm able to authenticate on my mongodb using the shell command: 我可以使用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"
                }
        ]
}

I've also been able to authenticate on it using java driver: 我也可以使用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);

Currently, I'm engaged on a project I want to use Hibernate OGM. 目前,我参与了一个我想使用Hibernate OGM的项目。 I've set persistence.xml file: 我设置了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>

As you can see I'm using SCRAM-SHA1 as authentication mechanism. 如您所见,我正在使用SCRAM-SHA1作为身份验证机制。

Nevertheless, I'm getting this message when I'm trying to deploy my application: 然而,当我尝试部署我的应用程序时,我收到此消息:

Caused by: org.hibernate.service.spi.ServiceException: OGM000071: Unable to start datatore provider Caused by: org.hibernate.HibernateException: OGM001214: Unable to connect to MongoDB instance: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. 引起:org.hibernate.service.spi.ServiceException:OGM000071:无法启动数据提供程序引起:org.hibernate.HibernateException:OGM001214:无法连接到MongoDB实例:在等待匹配的服务器30000毫秒后超时ReadPreferenceServerSelector {readPreference =初级}。 Client view of cluster state is {type=UNKNOWN, servers=[{address=mongo:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='user', source='lvdb', password=, mechanismProperties={}}}, caused by {com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' 集群状态的客户端视图是{type = UNKNOWN,servers = [{address = mongo:27017,type = UNKNOWN,state = CONNECTING,exception = {com.mongodb.MongoSecurityException:Exception authenticating MongoCredential {mechanism = SCRAM-SHA-1, userName ='user',source ='lvdb',password =,mechanismProperties = {}}},由{com.mongodb.MongoCommandException引起:命令失败,错误18:'身份验证失败。' on server mongo:27017. 在服务器上mongo:27017。 The full response is { \\"ok\\" : 0.0, \\"errmsg\\" : \\"Authentication failed.\\", \\"code\\" : 18, \\"codeName\\" : \\"AuthenticationFailed\\" }}}] Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. 完整响应为{\\“ok \\”:0.0,\\“errmsg \\”:\\“身份验证失败。\\”,\\“code \\”:18,\\“codeName \\”:\\“AuthenticationFailed \\”}}}]引发者:com.mongodb.MongoTimeoutException:在等待与ReadPreferenceServerSelector {readPreference = primary}匹配的服务器30000 ms后超时。 Client view of cluster state is {type=UNKNOWN, servers=[{address=mongo:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='user', source='lvdb', password=, mechanismProperties={}}}, caused by {com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' 集群状态的客户端视图是{type = UNKNOWN,servers = [{address = mongo:27017,type = UNKNOWN,state = CONNECTING,exception = {com.mongodb.MongoSecurityException:Exception authenticating MongoCredential {mechanism = SCRAM-SHA-1, userName ='user',source ='lvdb',password =,mechanismProperties = {}}},由{com.mongodb.MongoCommandException引起:命令失败,错误18:'身份验证失败。' on server mongo:27017. 在服务器上mongo:27017。 The full response is { \\"ok\\" : 0.0, \\"errmsg\\" : \\"Authentication failed.\\", \\"code\\" : 18, \\"codeName\\" : \\"AuthenticationFailed\\" }}}]"}} 完整响应为{\\“ok \\”:0.0,\\“errmsg \\”:\\“身份验证失败。\\”,\\“code \\”:18,\\“codeName \\”:\\“AuthenticationFailed \\”}}}] “}}

Hibernate OGM is currently using the database name as authentication database. Hibernate OGM目前使用数据库名称作为身份验证数据库。 This is a bug, I'm working on it right now. 这是一个错误,我现在正在努力。

In your example (all seems correct by the way), you want to connect to the "lvdb" db but you defined the user in the "admin" database. 在您的示例中(顺便说一下似乎都是正确的),您希望连接到“lvdb”数据库,但是您在“admin”数据库中定义了用户。 Hiebernate OGM is actually looking for the user in the "lvdb" database. Hiebernate OGM实际上是在“lvdb”数据库中寻找用户。

UPDATE : This problem has now been fixed in the latest stable release (5.1.0.Final), you can use the property hibernate.ogm.mongodb.authentication_database to select the name of the authentication database ( admin is the default name). 更新 :此问题现已在最新的稳定版本(5.1.0.Final)中得到修复,您可以使用属性hibernate.ogm.mongodb.authentication_database选择身份验证数据库的名称( admin是默认名称)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM