Docs 菜单
Docs 主页
/ / /
java sync
/

身份验证机制

在此页面上

  • Overview
  • 指定身份验证机制
  • 机制
  • 默认
  • SCRAM-SHA-256
  • SCRAM-SHA-1
  • MONGODB-CR
  • MONGODB-AWS
  • X.509

在本指南中,您可以了解如何使用 MongoDB Community Edition 提供的每个身份验证机制对 MongoDB 进行身份验证。身份验证机制是驱动程序和 MongoDB 部署确认身份并建立信任以确保安全的过程。

可以在最新版本的 MongoDB Community Edition 中使用如下机制:

要使用 KerberosLDAP进行身份验证,请参阅《 企业身份验证机制》指南。 有关建立与MongoDB 集群连接的更多信息,请阅读我们的连接指南。

您可以使用以下任一方式在连接到 MongoDB 时指定身份验证机制和凭据:

  • 连接字符串

  • MongoCredential工厂方法

连接字符串(也称为连接 uri)指定如何连接到 MongoDB 集群并对其进行身份验证。

要使用连接字符串进行身份验证,请将您的设置包含在连接字符串中并将其传递给MongoClients.create()方法以实例化您的MongoClient。选择 Connection String选项卡以查看使用连接字符串进行身份验证的事务语法。

或者,您可以使用 MongoCredential 类指定身份验证详细信息。MongoCredential 类包含静态工厂方法,可构造包含身份验证机制和档案的实例。使用 MongoCredential 辅助类时,您需要在构造 MongoClient 时使用 MongoClientSettings.Builder 类来配置连接设置。选择 MongoCredential 标签页,查看使用 MongoCredential 进行身份验证的事务语法。

有关这些类和方法的更多信息,请参阅以下 API 文档:

默认身份验证机制设置使用以下身份验证机制之一,具体取决于您的 MongoDB Server 版本支持的版本:

  1. SCRAM-SHA-256

  2. SCRAM-SHA-1

  3. MONGODB-CR

服务器版本 3.6 及更早版本将 MONGODB-CR 作为默认机制使用。较新版本的 MongoDB Server 使用其中一种机制宣传其支持。

以下代码片段演示如何使用以下占位符指定身份验证机制:

  • username — 您的 MongoDB 用户名

  • password — 您的 MongoDB 用户密码

  • hostname - MongoDB 部署的网络地址,可由您的客户端访问

  • port — MongoDB 部署的端口号

  • authenticationDb — 包含用户的身份验证数据的 MongoDB 数据库。如果省略此参数,驱动程序则会使用默认值 admin

选择下面的 Connection String(连接字符串)或 MongoCredential 标签页,以获取指定此身份验证机制的说明和示例代码:

若要使用连接字符串指定默认身份验证机制,请忽略该机制。用于实例化 MongoClient 的代码应如下所示:

MongoClient mongoClient = MongoClients.create("mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=<authenticationDb>");

要使用MongoCredential类指定默认身份验证机制,请使用createCredential()方法。 用于实例化MongoClient的代码应如下所示:

MongoCredential credential = MongoCredential.createCredential("<db_username>", "<authenticationDb>", "<db_password>");
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>))))
.credential(credential)
.build());

有关 MongoDB 支持的质询-响应 (CR) 和加盐质询-响应身份验证机制 (SCRAM) 的更多信息,请参阅 MongoDB 服务器手册的 SCRAM 部分。

注意

SCRAM-SHA-256 是从 MongoDB 4.0 开始使用的 MongoDB 默认身份验证方法。

SCRAM-SHA-256 是一种挑战-响应身份验证机制 (SCRAM),使用通过 SHA-256 算法加密的用户名和密码来验证用户身份。

以下代码片段演示如何使用以下占位符指定身份验证机制:

  • username - 您的 MongoDB 用户名。

  • password — MongoDB 用户的密码。

  • hostname — MongoDB 部署的网络地址,可由您的客户端访问。

  • port — MongoDB 部署的端口号。

  • authenticationDb — 包含用户的身份验证数据的 MongoDB 数据库。如果省略此参数,驱动程序则会使用默认值 admin

选择下面的 Connection String(连接字符串)或 MongoCredential 标签页,以获取指定此身份验证机制的说明和示例代码:

要使用连接字符串指定 SCRAM-SHA-256 身份验证机制,请在连接字符串中为 authMechanism 参数分配值 SCRAM-SHA-256。用于实例化 MongoClient 的代码应如下所示:

MongoClient mongoClient = MongoClients.create("mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=<authenticationDb>&authMechanism=SCRAM-SHA-256");

要使用MongoCredential 类指定默认身份验证机制,请使用 createScramSha256 Credential() 方法。用于实例化MongoClient的代码应如下所示:

MongoCredential credential = MongoCredential.createScramSha256Credential("<db_username>", "<authenticationDb>", "<db_password>");
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>))))
.credential(credential)
.build());

注意

SCRAM-SHA-1 是 MongoDB 版本 3.0、3.2、3.4 和 3.6 的默认身份验证方法。

SCRAM-SHA-1 是一种盐化质询-响应机制 (SCRAM),它使用您的用户名和密码,并通过 SHA-1 算法加密,来对您的用户进行身份验证。

以下代码片段演示如何使用以下占位符指定身份验证机制:

  • username - 您的 MongoDB 用户名。

  • password — MongoDB 用户的密码。

  • hostname — MongoDB 部署的网络地址,可由您的客户端访问。

  • port — MongoDB 部署的端口号。

  • authenticationDb — 包含用户的身份验证数据的 MongoDB 数据库。如果省略此参数,驱动程序则会使用默认值 admin

选择下面的 Connection String(连接字符串)或 MongoCredential 标签页,以获取指定此身份验证机制的说明和示例代码:

要使用连接字符串指定 SCRAM-SHA-1 身份验证机制,请在连接字符串中为 authMechanism 参数分配值 SCRAM-SHA-1。用于实例化 MongoClient 的代码应如下所示:

MongoClient mongoClient = MongoClients.create("mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=<authenticationDb>&authMechanism=SCRAM-SHA-1");

要使用MongoCredential 类指定默认身份验证机制,请使用 createScramSha1 Credential() 方法。用于实例化MongoClient的代码应如下所示:

MongoCredential credential = MongoCredential.createScramSha1Credential("<db_username>", "<authenticationDb>", "<db_password>");
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>))))
.credential(credential)
.build());

MONGODB-CR 是一种挑战-响应身份验证机制,它使用您的用户名和密码 来验证您的用户。 从 MongoDB 3.6 开始,这种身份验证机制已被弃用, 从 MongoDB 4.0 开始不再支持。

您无法明确指定此方法;请参阅默认身份验证机制提供的备用机制,以使用 MONGODB-CR 进行连接。

注意

MongoDB Atlas中提供了 MONGODB-AWS身份验证机制。

MONGODB-AWS 身份验证机制使用 Amazon Web Services Identity and Access Management (AWS IAM) 档案对用户进行身份验证。

您可以存储Amazon Web Services凭证存储为环境变量,也可以内联插入这些凭证,如以下示例所示。 驾驶员会按以下顺序检查您的凭证:

  1. MongoCredential 对象或所提供的连接string中提供的值。

  2. 您的环境变量。 ( AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY和可选的AWS_SESSION_TOKEN

  3. AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 环境变量中指定的Amazon Web Services EC2 端点。

  4. 默认Amazon Web Services EC2 端点。 有关更多信息,请参阅 适用于任务的 IAM 角色

以下代码片段演示如何使用以下占位符指定身份验证机制:

  • awsKeyId - AWS_ACCESS_KEY_ID的值。

  • awsSecretKey - AWS_SECRET_ACCESS_KEY的值。

  • atlasUri - MongoDB Atlas实例的网络解决。

  • awsSessionToken - AWS_SESSION_TOKEN的值。 (可选)

重要

对您的档案进行URL编码

确保对凭证进行 URL 编码,防止反斜杠或其他字符导致解析错误。 以下代码示例向您展示如何对样本string (由占位符 fieldValue 表示)进行 URL 编码:

String encodedField = java.net.URLEncoder.encode("<fieldValue>".toString(), "ISO-8859-1");

选择下面的 Connection String(连接字符串)或 MongoCredential 标签页,以获取指定此身份验证机制的说明和示例代码:

要使用连接字符串指定 MONGODB-AWS 身份验证机制,请在连接字符串中为 authMechanism 参数分配值 "MONGODB-AWS"。用于实例化 MongoClient 的代码应如下所示:

MongoClient mongoClient = MongoClients.create("mongodb://<awsKeyId>:<awsSecretKey>@<atlasUri>?authMechanism=MONGODB-AWS");

如果需要指定Amazon Web Services会话令牌,请使用 AWS_SESSION_TOKEN:<awsSessionToken> 格式将其包含在 authMechanismProperties 参数中,如下所示。 使用会话令牌实例化MongoClient的代码应如下所示:

MongoClient mongoClient = MongoClients.create("mongodb://<awsKeyId>:<awsSecretKey>@<atlasUri>?authMechanism=MONGODB-AWS&authMechanismProperties=AWS_SESSION_TOKEN:<awsSessionToken>");

MONGODB-AWSMongoCredential要使用 类指定 身份验证机制,请使用 createAwsCredential() 方法。用于实例化MongoClient的代码应如下所示:

MongoCredential credential = MongoCredential.createAwsCredential("<awsKeyId>", "<awsSecretKey>".toCharArray());
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("<hostname>"))))
.credential(credential)
.build());

如果需要指定Amazon Web Services会话令牌,可以使用以下选项之一进行添加:

  • 在连接 中指定Amazon Web Servicesstring 会话令牌。

    如果您希望将连接 中的 会话令牌与Amazon Web Servicesstring MongoCredential一起传递,请在authMechanism authMechanismProperties参数中指定身份验证机制,并在 参数中指定会话令牌。然后,通过调用MongoClientSettings applyConnectionString() 将其添加到 方法如下:

    MongoCredential credential = MongoCredential.createAwsCredential("<awsKeyId>", "<awsSecretKey>".toCharArray());
    ConnectionString connectionString = new ConnectionString("mongodb://<atlasUri>/?authMechanism=MONGODB-AWS&authMechanismProperties=AWS_SESSION_TOKEN:<awsSessionToken>");
    MongoClient mongoClient = MongoClients.create(
    MongoClientSettings.builder()
    .applyConnectionString(connectionString)
    .credential(credential)
    .build());
  • 在 MongoCredential 中指定您的Amazon Web Services会话令牌。

    您可以将Amazon Web Services 会话令牌包含在MongoCredential 实例中,方法是在调用 withMechanismProperty() 方法,如下图所示:

    MongoCredential credential = MongoCredential.createAwsCredential("<awsKeyId>", "<awsSecretKey>".toCharArray()).withMechanismProperty("AWS_SESSION_TOKEN", "<awsSessionToken>");
    ConnectionString connectionString = new ConnectionString("mongodb://<atlasUri>/?authMechanism=MONGODB-AWS");
    MongoClient mongoClient = MongoClients.create(
    MongoClientSettings.builder()
    .applyConnectionString(connectionString)
    .credential(credential)
    .build());
  • 在环境变量中指定Amazon Web Services会话令牌。

    在客户端执行环境中,设置一个名为AWS_SESSION_TOKEN的环境变量,并为其分配令牌。 当您指定MONGODB-AWS身份验证机制时,该值由MongoClient自动获取。

驾驶员支持在担任角色或使用 Elastic Kubernetes Service 等情况下刷新凭证。

Supplier<AwsCredential> awsFreshCredentialSupplier = () -> {
// Add your code to fetch new credentials, such as assuming a role using the AWS SDK.
// Ensure you return the temporary credentials.
return new AwsCredential("<awsKeyId>", "<awsSecretKey>", "<awsSessionToken>");
};
MongoCredential credential = MongoCredential.createAwsCredential(null, null)
.withMechanismProperty(MongoCredential.AWS_CREDENTIAL_PROVIDER_KEY, awsFreshCredentialSupplier);
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Collections.singletonList(new ServerAddress("<hostname>", 27017))))
.credential(credential)
.build());

注意

如果必须在连接字符串中提供 AWS IAM 凭证,请参阅之前发布的 MONGODB-AWS 驱动程序文档

X.509 身份验证机制使用 TLS 以及 X.509 证书对用户进行身份验证,并由客户端证书的相对标识名 (RDN) 进行标识。当您指定 X.509 身份验证机制时,服务器将使用客户端证书的标题名称对连接进行身份验证。

以下代码片段演示如何使用以下占位符指定身份验证机制:

  • hostname — MongoDB 部署的网络地址,可由您的客户端访问。

  • port — MongoDB 部署的端口号。

  • authenticationDb — 包含用户的身份验证数据的 MongoDB 数据库。如果省略此参数,驱动程序则会使用默认值 admin

选择下面的 Connection String(连接字符串)或 MongoCredential 标签页,以获取指定此身份验证机制的说明和示例代码:

要使用连接字符串指定 X.509 身份验证机制,请为 authMechanism 参数分配值 MONGODB-X509 并通过为 tls 参数分配 true 值来启用 TLS。用于实例化 MongoClient 的代码应如下所示:

MongoClient mongoClient = MongoClients.create("mongodb://<hostname>:<port>/?authSource=<authenticationDb>&authMechanism=MONGODB-X509&tls=true");

X.509MongoCredential要使用 类指定 身份验证机制,请使用 createMongoX509 Credential() 方法。此外,通过调用启用() 方法,然后在 SslSettings.Builderenabled true中将 属性设置为 区块。用于实例化MongoClient的代码应如下所示:

MongoCredential credential = MongoCredential.createMongoX509Credential();
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>))))
.applyToSslSettings(builder ->
builder.enabled(true);
)
.credential(credential)
.build());

有关配置应用程序以使用证书以及 TLS/SSL 选项的其他信息,请参阅我们的 TLS/SSL 指南

后退

使用 JNDI 数据源连接到 MongoDB