Docs 菜单
Docs 主页
/ / /
Java Reactive Streams 驱动程序
/

企业身份验证机制

MongoDB Enterprise Edition 包含MongoDB Community Edition中不提供的身份验证机制。 在本指南中,您可以学习;了解如何使用这些身份验证机制对MongoDB进行身份验证。 要学习;了解MongoDB中提供的其他身份验证机制,请参阅身份验证机制指南。

您可以使用以下任一方法在连接到MongoDB时指定凭证身份验证机制和档案:

  • 连接字符串

  • MongoCredential 工厂方法

连接字符串(也称为连接 uri)指定如何连接到 MongoDB 集群并对其进行身份验证。

要使用连接string进行身份验证,请将您的设置包含在连接string中,然后将其传递给 MongoClients.create() 方法以实例化您的 MongoClient。 选择以下部分中的 Connection String标签页,查看使用连接string进行身份验证的语法。

您还可以使用MongoCredential类来指定身份验证详细信息。 MongoCredential类包含静态工厂方法,用于构造包含身份验证机制和凭证的实例。 使用MongoCredential助手类时,请使用MongoClientSettings.Builder类配置连接设置。 选择以下部分中的MongoCredential标签页,查看使用MongoCredential进行身份验证的语法。

重要

The Java Reactive Streams驾驶员不支持UnixServerAddress 对象或域套接字连接。要使用域套接字进行连接,请使用Java同步驱动程序。否则,使用ServerAddress对象从Java Reactive Streams驾驶员进行连接。

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

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

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

  • hostname:客户端可以访问的 MongoDB 部署的网络地址

  • port:MongoDB 部署的端口号

选择Connection StringMongoCredential标签页以查看相应的语法。

以下示例使用连接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.security.krb5.realm=MYREALM.ME
java.security.krb5.kdc=mykdc.myrealm.me

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

  • 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 其他属性,请将该属性作为 参数包含在连接string URL中,格式如下:<PROPERTY_NAME>:<value>

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

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

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

选择SERVICE_NAME_KEYJAVA_SUBJECT_KEY标签页,查看如何指定相应的属性:

MongoCredential credential = MongoCredential
.createGSSAPICredential("<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("<username>");
credential = credential
.withMechanismProperty(MongoCredential.JAVA_SUBJECT_KEY, subject);

默认, Java Reactive Streams驾驶员按MongoClient实例缓存Kerberos票证。 如果您的部署经常创建和销毁MongoClient实例,则可以将默认Kerberos票证缓存行为更改为按进程缓存,以提高性能。

要按进程缓存Kerberos票证,必须使用 MongoCredential身份验证机制,因为连接string身份验证机制不支持JAVA_SUBJECT_PROVIDER 机制属性。 选择MongoCredential标签页,学习;了解如何按进程缓存Kerberos票证。

要按进程缓存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 的互操作性以及单点登录的实施。有关详细信息,请参阅以下资源:

您可以使用目录服务器用户名和密码向轻量级目录访问协议 (LDAP) 服务器进行身份验证。

提示

该身份验证机制名为 PLAIN 而不是 LDAP,因为它使用 RFC-4616 中定义的 PLAIN 简单身份验证和安全层 (SASL) 进行身份验证。

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

  • ldap_username:您的 LDAP 用户名

  • ldap_password:LDAP 用户的密码

  • hostname:客户端可以访问的 MongoDB 部署的网络地址

  • port:MongoDB 部署的端口号

选择Connection StringMongoCredential标签页以查看相应的语法。

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

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

MongoCredential credential = MongoCredential
.createPlainCredential(<ldap_username>, "$external", <ldap_password>);
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>))))
.credential(credential)
.build());

重要

MONGODB-OIDC 身份验证机制要求在 Linux 平台上运行 MongoDB Server v 7.0或更高版本。

以下部分介绍如何使用 MONGODB-OIDC 身份验证机制对各种平台进行身份验证。

有关 MONGODB-OIDC 身份验证机制的更多信息,请参阅 MongoDB Server 手册中的OpenID Connect 身份验证MongoDB Server 参数

如果应用程序在 Azure VM 上运行,或以其他方式使用 Azure 实例元数据服务 (IMDS),则可以使用 Java Reactive Streams 驱动程序的内置 Azure 支持对 MongoDB 进行身份验证。

您可以使用Azure MongoCredential或作为连接 的一部分来指定 IMDS OIDC身份验证。string

选择Connection StringMongoCredential标签页以查看相应的语法。

<username>占位符替换为Azure托管身份或企业应用程序的客户端ID或应用程序 ID 。 将以下代码中的<percent-encoded audience>占位符替换为MongoDB 部署上配置的受众服务器参数的百分比编码值。

逗号 ( , ) 字符及其编码 ( %2C ) 被保留,在值中使用这些字符会导致驾驶员将逗号解释为键值对的分隔符。 您必须在MongoCredential实例中指定包含逗号的值,如MongoCredential标签页中所示。

MongoClient mongoClient = MongoClients.create(
"mongodb://<username>@<hostname>:<port>/?" +
"?authMechanism=MONGODB-OIDC" +
"&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:<percent-encoded audience>");

<username>占位符替换为Azure托管身份或企业应用程序的客户端ID或应用程序 ID 。 将<audience>占位符替换为MongoDB 部署上配置的audience服务器参数的值。

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

如果您的应用程序在 Google Compute Engine VM 上运行,或以其他方式使用GCP实例元数据服务,则可以使用Java Reactive Streams 驱动程序的内置GCP支持向MongoDB进行身份验证。

您可以使用GCP MongoCredential或作为连接 的一部分来指定 IMDS OIDC身份验证。string

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

  • hostname:客户端可以访问的 MongoDB 部署的网络地址

  • port:MongoDB 部署的端口号

选择Connection StringMongoCredential标签页以查看相应的语法。

将以下代码中的<percent-encoded audience>占位符替换为MongoDB 部署上配置的受众服务器参数的百分比编码值。

逗号 ( , ) 字符及其编码 ( %2C ) 被保留,在值中使用这些字符会导致驾驶员将逗号解释为键值对的分隔符。 您必须在MongoCredential实例中指定包含逗号的值,如MongoCredential标签页中所示。

MongoClient mongoClient = MongoClients.create(
"mongodb://<hostname>:<port>/?" +
"authMechanism=MONGODB-OIDC" +
"&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:<percent-encoded audience>");

<audience>占位符替换为MongoDB 部署上配置的audience服务器参数的值。

MongoCredential credential = MongoCredential.createOidcCredential()
.withMechanismProperty("ENVIRONMENT", "gcp")
.withMechanismProperty("TOKEN_RESOURCE", "<audience>");
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>))))
.credential(credential)
.build());

如果应用程序在Kubernetes集群上运行,则可以使用Java Reactive Streams 驱动程序的内置Kubernetes支持向MongoDB进行身份验证。

Connection StringMongoCredential标签页中进行选择,以查看相应的语法。

要将Kubernetes OIDC 指定为身份验证机制,请在连接字符串中设立以下选项:

  • authMechanism:设置为MONGODB-OIDC

  • authMechanismProperties:设置为ENVIRONMENT:k8s

MongoClient mongoClient = MongoClients.create(
"mongodb://<hostname>:<port>/" +
"?authMechanism=MONGODB-OIDC" +
"&authMechanismProperties=ENVIRONMENT:k8s");

hostnameport 替换为MongoDB 部署的网络解决和端口号。

MongoCredential credential = MongoCredential.createOidcCredential(null)
.withMechanismProperty("ENVIRONMENT", "k8s");
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>))))
.credential(credential)
.build());

Java Reactive Streams驾驶员并不为所有平台提供内置支持,包括Azure Functions 和Azure Kubernetes Service (AKS)。 相反,您必须定义自定义回调,才能使用 OIDC 从这些平台进行身份验证。 为此,请使用"OIDC_CALLBACK"身份验证属性,如以下代码示例:

MongoCredential credential = MongoCredential.createOidcCredential(null)
.withMechanismProperty("OIDC_CALLBACK", (context) -> {
String accessToken = ...
return new OidcCallbackResult(accessToken);
});

"OIDC_CALLBACK" 属性的值必须是Lambda或接受 OidcCallbackContext 作为参数并返回 OidcCallbackResultOidcCallback 函数式接口的其他实现。

以下示例使用示例回调从本地文件系统中名为"access-token.dat"的文件中检索 OIDC 令牌:

MongoCredential credential = MongoCredential.createOidcCredential(null)
.withMechanismProperty("OIDC_CALLBACK", (context) -> {
string accessToken = new String(Files.readAllBytes(Paths.get("access-token.dat"));
return new OidcCallbackResult(accessToken);
});
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>))))
.credential(credential)
.build());

后退

身份验证

在此页面上