企业身份验证机制
概述
MongoDB 企业版包括在 MongoDB 社区版中不可用的身份验证机制。在本指南中,您可以了解如何使用这些身份验证机制对 MongoDB 进行身份验证。有关 MongoDB 中可用的其他身份验证机制的详细信息,请参阅身份验证机制指南。
指定认证机制
您可以在连接到MongoDB时,通过以下任一方式指定您的认证机制和凭据:
连接字符串
MongoCredential
工厂方法
连接字符串(也称为连接URI)指定了如何连接和认证到您的MongoDB集群。
要使用连接字符串进行认证,请将您的设置包含在连接字符串中,然后将它传递给 MongoClients.create()
方法以实例化您的 MongoClient
。选择以下部分中的 连接字符串 选项卡以查看使用连接字符串进行认证的语法。连接字符串 选项卡中的内容将在以下部分展示。
您还可以使用 MongoCredential
类来指定您的认证详情。该 MongoCredential
类包含静态工厂方法,用于构建包含您的认证机制和凭据的实例。当使用 MongoCredential
辅助类时,请使用 MongoClientSettings.Builder
类来配置您的连接设置。选择以下部分中的 MongoCredential 选项卡以查看使用 MongoCredential
进行认证的语法。
机制
凯beros (GSSAPI)
通用安全服务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_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
身份验证机制,因为连接字符串身份验证机制不支持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
而不是 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
重要
MONGODB-OIDC 认证机制需要运行在 Linux 平台上的 MongoDB 服务器 v7.0 或更高版本。
以下章节描述了如何使用 MONGODB-OIDC 认证机制来认证到不同的平台。
有关 MONGODB-OIDC 认证机制的更多信息,请参阅 MongoDB 服务器手册中的 OpenID Connect 认证 和 MongoDB 服务器参数。
Azure IMDS
如果您的应用程序在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());
GCP IMDS
如果您的应用程序在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());