文档菜单
文档首页
/ / /
Java Reactive Streams 驱动
/

企业身份验证机制

本页内容

  • 概述
  • 指定身份验证机制
  • 机制
  • Kerberos (GSSAPI)
  • LDAP (PLAIN)
  • MONGODB-OIDC

MongoDB 企业版包括在 MongoDB 社区版中不可用的身份验证机制。在本指南中,您可以了解如何使用这些身份验证机制对 MongoDB 进行身份验证。有关 MongoDB 中可用的其他身份验证机制的详细信息,请参阅身份验证机制指南。

您可以在连接到MongoDB时,通过以下任一方式指定您的认证机制和凭据:

  • 连接字符串

  • MongoCredential 工厂方法

连接字符串(也称为连接URI)指定了如何连接和认证到您的MongoDB集群。

要使用连接字符串进行认证,请将您的设置包含在连接字符串中,然后将它传递给 MongoClients.create() 方法以实例化您的 MongoClient。选择以下部分中的 连接字符串 选项卡以查看使用连接字符串进行认证的语法。连接字符串 选项卡中的内容将在以下部分展示。

您还可以使用 MongoCredential 类来指定您的认证详情。该 MongoCredential 类包含静态工厂方法,用于构建包含您的认证机制和凭据的实例。当使用 MongoCredential 辅助类时,请使用 MongoClientSettings.Builder 类来配置您的连接设置。选择以下部分中的 MongoCredential 选项卡以查看使用 MongoCredential 进行认证的语法。

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

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

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

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

  • port:您的MongoDB部署的端口号

选择 连接字符串MongoCredential 选项卡,以查看相应的语法。

以下示例通过连接字符串使用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());

获取一个凯beros票据,GSSAPI Java库要求您指定领域和密钥分发中心(KDC)系统属性。您可以根据以下示例设置这些设置

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

您可能需要根据您的凯beros配置指定一个或多个以下附加 MongoCredential 机制属性

  • 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 = 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身份验证机制,因为连接字符串身份验证机制不支持JAVA_SUBJECT_PROVIDER机制属性。选择MongoCredential选项卡,了解如何按进程缓存Kerberos票据。

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

/* 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活动目录和单点登录实现的互操作性。有关更多信息,请参阅以下资源

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

提示

认证机制命名为 PLAIN 而不是 LDAP,因为它使用的是 PLAIN 简单认证和安全层 (SASL),由 RFC-4616 定义

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

  • ldap_username: 您的 LDAP 用户名

  • ldap_password: 您的 LDAP 用户密码

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

  • port:您的MongoDB部署的端口号

选择 连接字符串MongoCredential 选项卡,以查看相应的语法。

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 服务器 v7.0 或更高版本。

以下章节描述了如何使用 MONGODB-OIDC 认证机制来认证到不同的平台。

有关 MONGODB-OIDC 认证机制的更多信息,请参阅 MongoDB 服务器手册中的 OpenID Connect 认证MongoDB 服务器参数

如果您的应用程序在Azure VM上运行,或者使用Azure实例元数据服务(IMDS),您可以使用Java Reactive Streams驱动程序的内置Azure支持通过认证连接到MongoDB。

您可以通过使用MongoCredential或将其作为连接字符串的一部分来指定Azure IMDS OIDC认证。

选择 连接字符串MongoCredential 选项卡,以查看相应的语法。

将代码中的<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反应式流驱动程序的内置GCP支持通过身份验证连接到MongoDB。

您可以通过使用MongoCredential或将其作为连接字符串的一部分来指定GCP IMDS OIDC身份验证。

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

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

  • port:您的MongoDB部署的端口号

选择 连接字符串MongoCredential 选项卡,以查看相应的语法。

将以下代码中的<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());

Java反应式流驱动程序并不为所有平台提供内置支持,包括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或其他实现OidcCallback功能接口的实例,该接口接受一个OidcCallbackContext作为参数并返回一个OidcCallbackResult

以下示例使用示例回调从本地文件系统中名为"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());

返回

身份验证