Docs 菜单

Kerberos (GSSAPI)

通用安全服务API (GSSAPI)身份验证机制允许使用主体名称对Kerberos服务进行身份验证。 只有在向MongoDB Enterprise Advanced进行身份验证时才能使用此机制。

本页上的代码示例使用以下占位符:

  • <db_username>:您的URL编码主体名称。示例:"username%40REALM.ME"

  • <hostname>: MongoDB 部署的网络解决。

  • <port>: MongoDB 部署的端口号。 如果省略此参数,驾驶员将使用默认端口号 (27017)。

要使用代码示例,请将这些占位符替换为您自己的值。

选择下面的 Connection String(连接字符串)或 MongoCredential 标签页,以获取指定此身份验证机制的说明和示例代码:

To specify the GSSAPI authentication mechanism by using a connection string, perform the following actions:

  • authMechanism URL 参数分配给值GSSAPI

  • 可选)将authSource URL 参数分配给值$external

注意

如果指定GSSAPI 机制,则不能将authSource 分配给$external 以外的任何值。

用于实例化 MongoClient 的代码如下所示:

MongoClient mongoClient = MongoClients.create("<db_username>@<hostname>:<port>/?authSource=$external&authMechanism=GSSAPI");

To specify the GSSAPI authentication mechanism by using the MongoCredential class, use the createGSSAPICredential() method. The code to instantiate a MongoClient resembles the following:

MongoCredential credential = MongoCredential.createGSSAPICredential(<db_username>);
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>))))
.credential(credential)
.build());

To acquire a Kerberos ticket, the GSSAPI Java libraries require you to specify the realm and Key Distribution Center (KDC) system properties. See the sample settings in the following example:

java.security.krb5.realm=MYREALM.ME
java.security.krb5.kdc=mykdc.myrealm.me

You might need to specify one or more of the following MongoCredential mechanism properties depending on your Kerberos setup:

  • SERVICE_NAME

  • CANONICALIZE_HOST_NAME

  • JAVA_SUBJECT

  • JAVA_SASL_CLIENT_PROPERTIES

  • JAVA_SUBJECT_PROVIDER

重要

您只能使用MongoCredential指定以下 GSSAPI 属性:

  • JAVA_SUBJECT

  • JAVA_SASL_CLIENT_PROPERTIES

  • JAVA_SUBJECT_PROVIDER

选择MongoCredential标签页,查看如何指定它们。

要指定某一 GSSAPI 附加属性,请将其作为 URL 参数包含在连接字符串中,格式如下: <PROPERTY_NAME>:<value>

使用 GSSAPI 和其他属性实例化MongoClient的代码可能如下所示:

MongoClient mongoClient = MongoClients.create("<db_username>@<hostname>:<port>/?authSource=$external&authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:myService");

要指定某一 GSSAPI 附加属性,请在MongoCredential实例上调用withMechanismProperty()方法,并将属性名称和值作为参数传递。 使用MongoCredential类中定义的属性名称常量:

选择SERVICE_NAME_KEYJAVA_SUBJECT_KEY标签页,查看示例代码,以实例化使用 GSSAPI 和所选属性的MongoCredential

MongoCredential credential = MongoCredential.createGSSAPICredential(<db_username>);
credential = credential.withMechanismProperty(MongoCredential.SERVICE_NAME_KEY, "myService");
LoginContext loginContext = new LoginContext(<LoginModule implementation from JAAS config>);
loginContext.login();
Subject subject = loginContext.getSubject();
MongoCredential credential = MongoCredential.createGSSAPICredential(<db_username>);
credential = credential.withMechanismProperty(MongoCredential.JAVA_SUBJECT_KEY, subject);

默认情况下,Java 驱动程序按MongoClient实例缓存 Kerberos 票证。 如果您的部署需要频繁创建和销毁MongoClient实例,则可以将默认 Kerberos 票证缓存行为更改为按进程缓存,以提高性能。

要按进程缓存 Kerberos 票证,必须使用MongoCredential身份验证机制,因为连接字符串身份验证机制不支持JAVA_SUBJECT_PROVIDER机制属性。如果您想按进程缓存 Kerberos 票证,请选择MongoCredential标签页以了解如何完成此操作。

要按进程缓存 Kerberos 票证,必须指定JAVA_SUBJECT_PROVIDER 机制属性并提供 KerberosSubjectProvider 在您的MongoCredential 实例中。将 Java 驱动程序配置为按进程缓存 Kerberos 票证的代码如下所示:

/* all MongoClient instances sharing this instance of KerberosSubjectProvider
will share a Kerberos ticket cache */
String myLoginContext = "myContext";
MongoCredential credential = MongoCredential.createGSSAPICredential(<db_username>);
/* login context defaults to "com.sun.security.jgss.krb5.initiate"
if unspecified in KerberosSubjectProvider */
credential = credential.withMechanismProperty(MongoCredential.JAVA_SUBJECT_PROVIDER_KEY,
new KerberosSubjectProvider(myLoginContext));

注意

On Windows, Oracle's JRE uses LSA rather than SSPI in its implementation of GSSAPI which limits interoperability with Windows Active Directory and implementations of single sign-on. For more information, see the following resources:

要学习;了解有关本页讨论的任何方法或类型的更多信息,请参阅以下API文档: