Docs 菜单
Docs 主页
/ /

企业身份验证机制

在本指南中,您可以了解如何使用 MongoDB Enterprise Edition 中提供的身份验证机制对 MongoDB 进行身份验证。 连接到 MongoDB 时,可以使用身份验证机制在驱动程序和服务器之间建立信任。

Rust 驱动程序支持使用 LDAP (PLAIN)企业身份验证机制向轻量级目录访问协议 (LDAP) 服务器进行身份验证。

提示

要使用MongoDB Community Edition中提供的机制对MongoDB进行身份验证,请参阅有关身份验证机制的指南。

要了解有关连接到 MongoDB 部署的更多信息,请参阅连接指南。

要选择特定的身份验证机制,请在连接字符串的选项或 Credential结构中指定该机制、您的档案和其他必要信息。

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

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

警告

此身份验证机制以明文形式将密码发送到服务器。 仅在对连接启用 TLS 后使用此机制,以提高安全性并减少应用程序中的漏洞。

要了解更多信息,请参阅 MongoDB Server手册中的 TLS/SSL(传输加密) 。

要指定PLAIN身份验证机制,请将Credential结构的mechanism字段设置为AuthMechanism::Plain 。 此示例使用以下占位符指定身份验证机制:

  • username:您的 LDAP 用户名

  • password:您的 LDAP 密码

let plain_cred = Credential::builder()
.username("<username>".to_string())
.password("<password>".to_string())
.mechanism(AuthMechanism::Plain)
.source("$external".to_string())
.build();
client_options.credential = Some(plain_cred);
let client = Client::with_options(client_options)?;

注意

身份验证数据库

由于您的档案存储在 MongoDB 外部,因此您必须使用$external数据库进行身份验证。 The source field of the Credential struct defaults to $external, so you can omit this field.

或者,您可以通过将authMechanism连接字符串选项的值设置为PLAIN来使用连接字符串 URI 进行身份验证。 此示例演示如何使用以下占位符在连接字符串 URI 中指定PLAIN身份验证机制:

  • username:您的 LDAP 用户名

  • password:您的 LDAP 密码

  • hostname:你的 MongoDB Server 的网络地址

let uri = "mongodb://<username>:<password>@<hostname>/?authSource=$external&authMechanism=PLAIN";

重要

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

Rust驱动程序支持对工作负载身份进行 OpenID Connect (OIDC) 身份验证。工作负载身份是分配给软件工作负载(例如应用程序、服务、脚本或容器)的身份,用于验证和访问权限其他服务和资源。

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

要学习;了解有关 MONGODB-OIDC身份验证机制的更多信息,请参阅服务器手册中的 OpenID Connect 身份验证和MongoDB Server参数。

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

您可以通过将 Credential 结构的 mechanism字段设置为 AuthMechanism::MongoDbOidc 来为Azure IMDS 配置 OIDC。 此示例使用以下占位符指定身份验证机制:

  • username:如果使用的是 Azure 托管标识,请将其设置为托管标识的客户端 ID。 如果使用服务主体代表企业应用程序,请将其设置为服务主体的应用程序 ID。

  • mechanism_properties:将 ENVIRONMENT属性设置为 azure,并将 TOKEN_RESOURCE 设置为MongoDB 部署上配置的受众参数的值。

以下代码示例展示了如何在创建Client时设立这些选项:

let credential = Credential::builder()
.username("<username>".to_owned())
.mechanism(AuthMechanism::MongoDbOidc)
.mechanism_properties(
doc! { "ENVIRONMENT": "azure", "TOKEN_RESOURCE": "<audience>" }
)
.build();
client_options.credential = Some(credential);
let client = Client::with_options(client_options)?;
let res = client
.database("test")
.collection::<Document>("test")
.find_one(doc! {})
.await?;

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

您可以通过将 Credential 结构的 mechanism字段设置为 AuthMechanism::MongoDbOidc 来为GCP IMDS 配置 OIDC。 然后,通过在 mechanism_properties字段中设置以下值来指定身份验证机制:

  • ENVIRONMENT:将此属性设置为 gcp

  • TOKEN_RESOURCE:将此属性设置为MongoDB 部署上配置的受众参数值。

以下代码示例展示了如何在创建Client时设立这些选项:

let credential = Credential::builder()
.mechanism(AuthMechanism::MongoDbOidc)
.mechanism_properties(
doc! { "ENVIRONMENT": "gcp", "TOKEN_RESOURCE": "<audience>" }
)
.build();
client_options.credential = Some(credential);
let client = Client::with_options(client_options)?;
let res = client
.database("test")
.collection::<Document>("test")
.find_one(doc! {})
.await?;

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

您可以通过将 Credential 结构体的 mechanism字段设置为 AuthMechanism::MongoDbOidc,为Kubernetes配置 OIDC。然后,通过在 mechanism_properties字段中将 ENVIRONMENT属性设置为 k8s 来指定身份验证机制。

以下代码示例展示了如何在创建Client时设立这些选项:

let credential = Credential::builder()
.mechanism(AuthMechanism::MongoDbOidc)
.mechanism_properties(
doc! { "ENVIRONMENT": "k8s" }
)
.build();
client_options.credential = Some(credential);
let client = Client::with_options(client_options)?;
let res = client
.database("test")
.collection::<Document>("test")
.find_one(doc! {})
.await?;

Rust驱动程序不为所有平台提供内置支持,包括 AWS Elastic Kubernetes Service (EKS)。要使用 OIDC 对不受支持的平台进行身份验证,您必须定义自定义回调函数。

以下代码是针对 EKS集群的自定义回调的示例实施。 首先,将 Credential 结构的 oidc_callback字段设立为 oidc::Callback::machine。 然后,从 AWS_WEB_IDENTITY_TOKEN_FILE 环境变量中设立的路径读取访问权限令牌。 最后,设立IdpServerResponse 结构的 access_token字段的值。 (可选)设立expiresrefresh_token 字段的值。

let credential = Credential::builder()
.mechanism(AuthMechanism::MongoDbOidc)
.oidc_callback(oidc::Callback::machine(move |_| {
async move {
let token_file_path = std::env::var("AWS_WEB_IDENTITY_TOKEN_FILE").map_err(mongodb::error::Error::custom)?;
let access_token = tokio::fs::read_to_string(token_file_path).await?;
Ok(IdpServerResponse::builder().access_token(access_token).build())
}
.boxed()
}))
.build()
.into();
client_options.credential = Some(credential);
let client = Client::with_options(client_options)?;
let res = client
.database("test")
.collection::<Document>("test")
.find_one(doc! {})
.await?;

当员工身份身份验证进程涉及人机交互时,您必须通过将 Credential 结构的 oidc_callback字段设置为 oidc::Callback::human 而不是 oidc::Callback::machine 来配置客户端。Rust驱动程序在以下进程中使用回调:

  1. 驱动程序检索所提供的用户名的身份提供程序信息 (IDPInfo)。

  2. 该回调与 IDP 协商以获取 access_token 以及任何潜在的 refresh_token 和超时值(如果已配置)。 回调会返回一个 Result<IdpServerInfo>

以下示例定义了一个自定义回调来处理员工身份。要根据您的使用案例自定义此示例,请将 <human flow> 替换为您自己的自定义流程。有关详细信息,请参阅OIDC 授权代码流程

let callback = Callback::human(move |context| {
async move {
"<human flow>";
todo!("human flow")
}
.boxed()
});
let credential = Credential::builder()
.mechanism(AuthMechanism::MongoDbOidc)
.oidc_callback(callback)
.build();
client_options.credential = Some(credential);
let client = Client::with_options(client_options)?;
let res = client
.database("test")
.collection::<Document>("test")
.find_one(doc! {})
.await?;

通用安全服务API (GSSAPI)身份验证机制允许您使用主体名称对Kerberos服务进行身份验证。要指定 GSSAPI身份验证机制,请将 Credential 结构的 mechanism字段设立为 AuthMechanism::Gssapi

或者,您可以通过在 mechanism_properties字段中设置 SERVICE_REALMSERVICE_NAMESERVICE_HOST 属性来指定身份验证机制属性。

此示例使用以下占位符指定身份验证机制:

  • <username>:您的URL编码主体名称

  • <password>:您的Kerberos密码

let gssapi_cred = Credential::builder()
.username("<username>".to_string())
.password("<password>".to_string())
.mechanism(AuthMechanism::Gssapi)
.mechanism_properties(
doc! { "SERVICE_REALM": "<service_realm>", "SERVICE_NAME": "<service_name>", "SERVICE_HOST": "<service_host>" }
)
.build();
client_options.credential = Some(gssapi_cred);
let client = Client::with_options(client_options)?;

有关 GSSAPI (Kerberos) 的更多信息,请参阅服务器手册中的Kerberos身份验证

要了解有关本指南中概念的更多信息,请参阅以下文档:

要进一步了解本指南所提及的方法和类型,请参阅以下 API 文档:

后退

身份验证

在此页面上