企业身份验证机制
概述
在本指南中,您可以学习如何使用MongoDB企业版提供的认证机制来对MongoDB进行身份验证。当您连接到MongoDB时,您可以使用认证机制在驱动程序和服务器之间建立信任。
Rust驱动程序支持通过使用LDAP (PLAIN)企业认证机制来对轻量级目录访问协议(LDAP)服务器进行身份验证。
要选择特定的认证机制,请在连接字符串的选项中或在一个凭证
结构中指定机制、凭据和其他必要信息。
通过LDAP (PLAIN)进行认证
您可以使用您的目录服务器用户名和密码来对轻量级目录访问协议(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-OIDC 身份验证机制需要 MongoDB 服务器 v7.0 或更高版本,在 Linux 平台上运行。
Rust 驱动支持为 workload identities(工作负载身份)提供 OpenID Connect (OIDC) 身份验证。工作负载身份是您分配给软件工作负载(如应用程序、服务、脚本或容器)的身份,用于身份验证和访问其他服务和资源。
以下部分描述了如何使用 MONGODB-OIDC 身份验证机制在各种平台上进行身份验证。
有关 MONGODB-OIDC 身份验证机制的更多信息,请参阅服务器手册中的 OpenID Connect 身份验证 和 MongoDB 服务器参数。
Azure IMDS
如果您的应用程序运行在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?;
GCP IMDS
如果您的应用程序运行在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
字段的值。可选地,设置expires
和refresh_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驱动程序在以下过程中使用回调:
驱动程序检索提供的用户名的身份提供者信息(IDPInfo)。
回调与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?;
更多信息
有关本指南中的概念,请参阅以下文档
服务器手册中的MongoDB服务器对LDAP代理身份验证的支持
指南连接选项
服务器手册中的连接字符串
API 文档
要了解更多关于本指南中提到的方法和类型,请参阅以下API文档