文档菜单
文档首页
/ / /
Rust 驱动
/

企业身份验证机制

本页内容

  • 概述
  • 通过 LDAP (PLAIN) 身份验证
  • 示例
  • MONGODB-OIDC
  • Azure IMDS
  • GCP IMDS
  • 自定义回调
  • 更多信息
  • API 文档

在本指南中,您可以学习如何使用MongoDB企业版提供的认证机制来对MongoDB进行身份验证。当您连接到MongoDB时,您可以使用认证机制在驱动程序和服务器之间建立信任。

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

注意

GSSAPI/Kerberos认证

驱动程序不支持GSSAPI/Kerberos认证机制,但您可以使用其他方法进行认证。有关这些方法的更多信息,请参阅服务器手册中的Kerberos认证

提示

另请参阅

要使用MongoDB社区版提供的机制进行身份验证,请参阅认证机制.

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

要选择特定的认证机制,请在连接字符串的选项中或在一个凭证结构中指定机制、凭据和其他必要信息。

您可以使用您的目录服务器用户名和密码来对轻量级目录访问协议(LDAP)服务器进行认证。

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

警告

此认证机制会将您的密码以明文形式发送到服务器。仅在您的连接上启用TLS以增强安全性和降低应用程序中的漏洞后,才应使用此机制。

有关更多信息,请参阅服务器手册中的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数据库进行认证。默认情况下,Credential结构体的source字段为$external,因此您可以省略此字段。

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

  • username:您的LDAP用户名

  • password:您的LDAP密码

  • hostname:您的 MongoDB 服务器的网络地址

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

重要

MONGODB-OIDC 身份验证机制需要 MongoDB 服务器 v7.0 或更高版本,在 Linux 平台上运行。

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

以下部分描述了如何使用 MONGODB-OIDC 身份验证机制在各种平台上进行身份验证。

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

如果您的应用程序运行在Azure虚拟机上,或者使用Azure实例元数据服务(IMDS),您可以使用Rust驱动程序内置的Azure支持通过MongoDB进行身份验证。

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

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

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

以下代码示例显示了在创建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虚拟机(VM)上,或者使用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?;

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文档

返回

身份验证