13

私は MOngoDB + Java 構成に非常に慣れていません。Java アプリケーションからリモート mongodb サーバーからの接続を確立しようとしています。mongotemplate との接続に GSSAPI メカニズムを使用したい。以下のコードは正常に実行されています。以下のコードは私の構成ファイルからのものです。

List<ServerAddress> serverAddresses = new ArrayList<ServerAddress>();
    ServerAddress address = new ServerAddress(host, port);
    serverAddresses.add(address);
    List<MongoCredential> credentials = new ArrayList<MongoCredential>();

    MongoCredential credential = MongoCredential.createGSSAPICredential(userName);

    credential.withMechanismProperty("SERVICE_NAME", gssapiServiceName);
    credential.withMechanismProperty("CANONICALIZE_HOST_NAME", true);
    credentials.add(credential);

    return new MongoClient(serverAddresses, credentials);

しかし、コードの下で実行しようとすると、例外が発生します

DB db = mongoTemplate.getDb();
Set<String> dbCollections1 = db.getCollectionNames();

例外:

GSSException: 有効な認証情報が提供されていません (メカニズム レベル: Kerberos tgt が見つかりませんでした)。 .java:122)、sun.security.jgss.GSSManagerImpl.getCredentialElement(GSSManagerImpl.java:193)、sun.security.jgss.GSSCredentialImpl.add(GSSCredentialImpl.java:427)、sun.security.jgss.GSSCredentialImpl.(GSSCredentialImpl) .java:62) の sun.security.jgss.GSSManagerImpl.createCredential(GSSManagerImpl.java:154) の com.mongodb.DBPort$GSSAPIAuthenticator.getGSSCredential(DBPort.java:622) の com.mongodb.DBPort$GSSAPIAuthenticator.createSaslClient( DBPort.java:593) com.mongodb.DBPort$SaslAuthenticator.authenticate(DBPort.java:895) で com.com.mongodb.DBPort.checkAuth(DBPort.java:443) の mongodb.DBPort.authenticate(DBPort.java:432) com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:289) の com.mongodb.DBTCPConnector.call (DBTCPConnector.java:269) com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:84) で com.mongodb.DB.command(DB.java:320) で com.mongodb.DB.command(DB.java: 299) com.mongodb.DB.command (DB.java:388) で com.mongodb.DBApiLayer.getCollectionNames (DBApiLayer.java:152) で320) com.mongodb.DB.command(DB.java:299) com.mongodb.DB.command(DB.java:388) com.mongodb.DBApiLayer.getCollectionNames(DBApiLayer.java:152)320) com.mongodb.DB.command(DB.java:299) com.mongodb.DB.command(DB.java:388) com.mongodb.DBApiLayer.getCollectionNames(DBApiLayer.java:152)

4

3 に答える 3

15

回答してくれたすべての人に感謝し、私の質問を見てください。

いくつかのシステム プロパティと新しい conf ファイルを追加した後、ようやく MongoDB サーバーに接続できるようになりました。これで更新されたコード -

try {
        System.setProperty("java.security.krb5.conf","C:/mongodb/UnixKeytab/krb5.conf");
        System.setProperty("java.security.krb5.realm","EXAMPLE.COM");
        System.setProperty("java.security.krb5.kdc","example.com");
        System.setProperty("javax.security.auth.useSubjectCredsOnly","false");
        System.setProperty("java.security.auth.login.config","C:/mongodb/UnixKeytab/gss-jaas.conf");


        List<ServerAddress> serverAddresses = new ArrayList<ServerAddress>();
        ServerAddress address = new ServerAddress(host, port);
        serverAddresses.add(address);
        List<MongoCredential> credentials = new ArrayList<MongoCredential>();
        MongoCredential credential = MongoCredential.createGSSAPICredential(username);
        credentials.add(credential);
        MongoClient mongoClient1 = new MongoClient(serverAddresses, credentials);
        DB db = mongoClient1.getDB(database);

    } catch (UnknownHostException e) {
        e.printStackTrace();
    }

私の krb5.conf ファイルは以下のようになります -

[libdefaults]
     default_realm = EXAMPLE.COM
     default_tkt_enctypes = des-cbc-md5 rc4-hmac
     default_tgs_enctypes = des-cbc-md5 rc4-hmac
     default_keytab_name = <keytab file path>
[realms]
EXAMPLE.COM = {
    kdc = example.com
    master_kdc = example.com
    default_domain = EXAMPLE.COM
}
INTRANET = {
    kdc = example.com
    master_kdc = example.com
    default_domain = example.com
}

私の gss-jaas.conf は以下のようになります -

com.sun.security.jgss.initiate {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
useTicketCache=false
principal="my-account@MY_REALM"
doNotPrompt=true
keyTab="path-to-my-keytab-file"
debug=true;};

私が投稿したコードは私のために働いています。これが他の人にも役立つことを願っています。

于 2015-11-23T12:37:17.680 に答える