【发布时间】:2015-11-20 14:22:42
【问题描述】:
我对 MMongoDB + Java 配置非常陌生。我正在尝试从 Java 应用程序实现与远程 mongodb 服务器的连接。我想使用 GSSAPI 机制与 mongotemplate 连接。下面的代码已经成功执行。下面的代码来自我的配置文件。
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) 在 sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.java:147) 在 sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.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.mongodb.DBPort.authenticate(DBPort.java:432) 在 com.mongodb.DBPort.checkAuth(DBPort.java:443) 在 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)
【问题讨论】:
-
我对 MongoDB 一无所知,但该错误消息意味着 GSSAPI 认为您想使用 Kerberos 协议——是真的吗?如果是,您是否提供了配置来告诉 GSSAPI 如何联系 Kerberos 服务器?以及 (a) 缓存现有 Kerberos 票证的位置,或者 (b) 如何找到密码并即时创建票证?顺便说一句,如果您使用 Sun/Oracle JVM,您是否下载了“无限强度加密”策略 JAR 以启用 AES256 加密?
-
是的,我想使用 Kerberos 协议。我设置了两个系统环境变量 1. KRB5_CONFIG=krb5.conf 2.KRB5_KTNAME=username.keytab 这就是我为配置视角所做的。我正在从 Java Web 应用程序访问这个 mongodb 服务器。希望我能够回答您的问题。
-
查看stackoverflow.com/questions/21375372/… 了解设置 Kerberos conf 的肮脏细节(好吧,一些细节)
-
加上一个有用的跟踪标志来解决配置问题:
-Djava.security.debug=gssloginconfig,configfile,configparser,logincontext
标签: java spring mongodb spring-mvc spring-security-kerberos