对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

Kerberos (GSSAPI) 身份验证

通用安全服务API (GSSAPI)身份验证机制允许您通过指定Kerberos主体名称来对Kerberos服务进行身份验证。

注意

术语

该页面在提及身份验证机制时使用 GSSAPI,在提及底层协议或服务时使用 Kerberos。驱动程序通过使用在 Kerberos 协议之上构建的 GSSAPI RFC-4752 SASL 机制进行身份验证。

以下部分包含使用以下占位符值的代码示例:

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

  • <hostname>: MongoDB 部署的网络解决,可由客户端访问

  • <port>: MongoDB 部署的端口号

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

以下示例使用连接string对 GSSAPI 进行身份验证:

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

要使用MongoCredential类指定 GSSAPI身份验证机制,请调用createGSSAPICredential()方法,如以下示例所示:

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

为了获取Kerberos 工单,GSSAPI Java 库要求您指定域和密钥分发中心 (KDC) Java虚拟机(JVM) 系统属性。以下示例显示如何设置这些属性:

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

您可能需要指定以下一个或多个附加的身份验证机制属性,具体取决于 Kerberos 设置:

  • SERVICE_NAME

  • CANONICALIZE_HOST_NAME

  • JAVA_SUBJECT

  • JAVA_SASL_CLIENT_PROPERTIES

  • JAVA_SUBJECT_PROVIDER

选择下面的 Connection StringMongoCredential 标签页,以获取指定这些属性的说明和示例代码:

要指定 GSSAPI 其他属性,请将该属性作为 URL 参数以 <PROPERTY_NAME>:<value> 格式包含在连接字符串中。

以下示例对 GSSAPI 进行身份验证并指定 SERVICE_NAME 属性:

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

重要

您只能在 MongoCredential 实例上指定以下 GSSAPI 属性:

  • JAVA_SUBJECT

  • JAVA_SASL_CLIENT_PROPERTIES

  • JAVA_SUBJECT_PROVIDER

选择MongoCredential标签页,学习;了解如何指定这些属性。

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

以下示例对 GSSAPI 进行身份验证并指定 SERVICE_NAME_KEY 常量:

MongoCredential credential = MongoCredential
.createGSSAPICredential("<username>");
credential = credential
.withMechanismProperty(MongoCredential.SERVICE_NAME_KEY, "<myService>");

JAVA_SUBJECT_KEY 属性需要 javax.security.auth.Subject 对象。要检索 Subject,必须首先通过使用 LoginContext 通过 Java 身份验证和授权服务 (JAAS) 进行身份验证。以下示例展示了此配置:

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

默认情况下,Java Reactive Streams 驱动程序会根据创建它们的 MongoClient 实例缓存 Kerberos 工单。如果您的部署频繁创建和销毁 MongoClient 实例,则可以通过将默认 Kerberos 工单缓存行为更改为按进程缓存来提高性能。

重要

您必须使用 MongoCredential 类来更改默认缓存行为,因为连接字符串身份验证机制不支持 JAVA_SUBJECT_PROVIDER 机制属性。

要按进程缓存Kerberos票证,请指定JAVA_SUBJECT_PROVIDER 机制属性并在 实例中提供 KerberosSubjectProvider,如以下示例所示:MongoCredential

/* All MongoClient instances sharing this instance of KerberosSubjectProvider
will share a Kerberos ticket cache */
String myLoginContext = "myContext";
MongoCredential credential = MongoCredential
.createGSSAPICredential("<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));

注意

在 Windows 上,Oracle 的 JRE 在其 GSSAPI 实现中使用 本地安全授权 (LSA),而不是 安全支持提供商接口 (SSPI)。这会限制与 Windows Active Directory 和单点登录实现的互操作性。要了解更多信息,请参阅以下资源:

要学习;了解有关向MongoDB进行身份验证的更多信息,请参阅MongoDB Server手册中的身份验证。

要了解如何使用 Java Reactive Streams 驱动程序创建 MongoClient 对象,请参阅 连接到 MongoDB 指南。

要学习;了解有关本指南中提到的类和方法的更多信息,请参阅以下API文档: