企业身份验证机制
Overview
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
进行身份验证的语法。
机制
Kerberos (GSSAPI)
通用安全服务API (GSSAPI)身份验证机制允许您使用主体名称对Kerberos服务进行身份验证。
以下部分包含使用以下占位符的代码示例:
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.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_KEY或JAVA_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));
LDAP (Plain)
您可以使用目录服务器用户名和密码向轻量级目录访问协议 (LDAP) 服务器进行身份验证。
提示
身份验证机制名为PLAIN
而不是LDAP
,因为它使用 RFC- 中定义的 PLAIN 简单身份验证和安全层 (SASL)4616 进行身份验证。 。
以下部分包含使用以下占位符的代码示例:
ldap_username
:您的 LDAP 用户名ldap_password
:LDAP 用户的密码hostname
:客户端可以访问的 MongoDB 部署的网络地址port
:MongoDB 部署的端口号
选择Connection String或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
重要
MONGODB-OIDC 身份验证机制要求在 Linux 平台上运行 MongoDB Server v 7.0或更高版本。
以下部分介绍如何使用 MONGODB-OIDC 身份验证机制对各种平台进行身份验证。
有关 MONGODB-OIDC 身份验证机制的更多信息,请参阅 MongoDB Server 手册中的OpenID Connect 身份验证和MongoDB Server 参数。
Azure IMDS
如果应用程序在Azure VM 上运行,或以其他方式使用 Azure实例元数据服务(IMDS),您可以使用Java Reactive Streams 驱动程序的内置Azure支持对MongoDB进行身份验证。
您可以使用Azure MongoCredential
或作为连接 的一部分来指定 IMDS OIDC身份验证。string
选择Connection String或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());
GCP IMDS
如果您的应用程序在 Google Compute Engine 虚拟机上运行,或以其他方式使用 GCP实例元数据服务 ,您可以使用Java Reactive Streams 驱动程序的内置GCP支持对MongoDB进行身份验证。
您可以使用GCP MongoCredential
或作为连接 的一部分来指定 IMDS OIDC身份验证。string
以下部分包含使用以下占位符的代码示例:
hostname
:客户端可以访问的 MongoDB 部署的网络地址port
:MongoDB 部署的端口号
选择Connection String或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 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
作为参数并返回 OidcCallbackResult
的 OidcCallback
函数式接口的其他实现。
以下示例使用示例回调从本地文件系统中名为"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());