身份验证机制
概述
在本指南中,您可以学习如何使用MongoDB社区版中提供的每种进行身份验证。身份验证机制是驱动程序和服务器确认身份并建立信任的过程,以确保安全性。
您可以在MongoDB社区版最新版本中使用以下机制
要使用Kerberos
或LDAP
进行身份验证,请参阅企业身份验证机制指南.
有关建立与您的MongoDB集群连接的更多信息,请阅读我们的连接指南。
指定身份验证机制
您可以在连接到MongoDB时使用以下任一方式指定您的身份验证机制和凭据
连接字符串
MongoCredential
工厂方法
连接字符串(也称为连接URI)指定了如何连接和验证到您的MongoDB集群。
要使用连接字符串进行身份验证,请将您的设置包含在连接字符串中,并将其传递给MongoClient.create()
方法以实例化您的MongoClient
。每个部分的“连接字符串”选项卡提供了使用连接字符串进行身份验证的语法。连接字符串选项卡在每个部分都提供了使用连接字符串进行身份验证的语法。
此外,您还可以使用 MongoCredential
类来指定您的身份验证信息。MongoCredential
类包含静态工厂方法,用于构建包含您的身份验证机制和凭证的实例。当您使用 MongoCredential
辅助类时,您需要使用 MongoClientSettings.Builder
类来配置您的连接设置,在构建您的 MongoClient
时。每个部分中的 MongoCredential 选项卡提供了使用 MongoCredential
进行身份验证的语法。
有关这些类和方法的更多信息,请参阅以下API文档
机制
默认
默认的身份验证机制设置会根据您的MongoDB服务器支持以下哪种身份验证机制而使用其中之一
SCRAM-SHA-256
SCRAM-SHA-1
MONGODB-CR
服务器版本3.6及以下使用 MONGODB-CR
作为默认机制。较新版本的服务器使用它们宣传支持的机制之一。
以下代码片段显示了如何指定身份验证机制,使用以下占位符
db_username
- 您的MongoDB数据库用户名db_password
- 您的MongoDB数据库用户的密码hostname
- 可由您的客户端访问的MongoDB服务器的网络地址port
- 您的MongoDB服务器的端口号authenticationDb
- 包含您的用户身份验证数据的MongoDB数据库。如果您省略此参数,驱动程序使用默认值admin
。
选择下面的 连接字符串 或 MongoCredential 选项卡以获取指定此身份验证机制的说明和示例代码
要使用连接字符串指定默认的认证机制,请省略机制。您实例化MongoClient
的代码应类似于以下内容:
val mongoClient = MongoClient.create("mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=<authenticationDb>")
要使用MongoCredential
类指定默认的认证机制,请使用createCredential()
方法。您实例化MongoClient
的代码应类似于以下内容:
val credential = MongoCredential.createCredential( "<db_username>", "<authenticationDb>", "<db_password>".toCharArray() ) val settings = MongoClientSettings.builder() .applyToClusterSettings { builder: ClusterSettings.Builder -> builder.hosts( listOf(ServerAddress("<hostname>", "<port>")) ) } .credential(credential) .build() val mongoClient = MongoClient.create(settings)
有关MongoDB支持的挑战-响应(CR)和加盐挑战-响应认证机制(SCRAM)的更多信息,请参阅服务器手册中的SCRAM部分。
SCRAM-SHA-256
注意
SCRAM-SHA-256
是MongoDB 4.0开始使用的默认认证方法。
SCRAM-SHA-256
是一种使用您的用户名和密码(用SHA-256
算法加密)进行认证的加盐挑战-响应认证机制(SCRAM)。
以下代码片段显示了如何指定身份验证机制,使用以下占位符
db_username
- 您的MongoDB数据库用户名。db_password
- 您的MongoDB数据库用户的密码。hostname
- 您的MongoDB服务器可由客户端访问的网络地址。port
- 您的MongoDB服务器的端口号。authenticationDb
- 包含您的用户身份验证数据的MongoDB数据库。如果您省略此参数,驱动程序使用默认值admin
。
选择下面的 连接字符串 或 MongoCredential 选项卡以获取指定此身份验证机制的说明和示例代码
要使用连接字符串指定SCRAM-SHA-256
认证机制,请在您的连接字符串中将authMechanism
参数的值设置为SCRAM-SHA-256
。您实例化MongoClient
的代码应类似于以下内容:
val mongoClient = MongoClient.create("mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=<authenticationDb>&authMechanism=SCRAM-SHA-256")
要使用MongoCredential
类指定默认的认证机制,请使用createScramSha256Credential()方法。您实例化MongoClient
的代码应类似于以下内容:
val credential = MongoCredential.createScramSha256Credential( "<db_username>", "<authenticationDb>", "<db_password>".toCharArray() ) val settings = MongoClientSettings.builder() .applyToClusterSettings { builder: ClusterSettings.Builder -> builder.hosts( listOf(ServerAddress("<hostname>", "<port>")) ) } .credential(credential) .build() val mongoClient = MongoClient.create(settings)
SCRAM-SHA-1
注意
SCRAM-SHA-1
是 MongoDB 3.0、3.2、3.4 和 3.6 版本的默认认证方法。
SCRAM-SHA-1
是一种使用您的用户名和密码(通过 SHA-1 算法加密)进行认证的盐值挑战-响应机制 (SCRAM)。
以下代码片段显示了如何指定身份验证机制,使用以下占位符
db_username
- 您的MongoDB数据库用户名。db_password
- 您的MongoDB数据库用户的密码。hostname
- 您的MongoDB服务器可由客户端访问的网络地址。port
- 您的MongoDB服务器的端口号。authenticationDb
- 包含您的用户身份验证数据的MongoDB数据库。如果您省略此参数,驱动程序使用默认值admin
。
选择下面的 连接字符串 或 MongoCredential 选项卡以获取指定此身份验证机制的说明和示例代码
要使用连接字符串指定 SCRAM-SHA-1
认证机制,请将连接字符串中的 authMechanism
参数设置为 SCRAM-SHA-1
。您创建 MongoClient
的代码应类似于以下示例
val mongoClient = MongoClient.create("mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=<authenticationDb>&authMechanism=SCRAM-SHA-1")
要使用 MongoCredential
类指定默认认证机制,请使用 createScramSha1Credential() 方法。您创建 MongoClient
的代码应类似于以下示例
val credential = MongoCredential.createScramSha1Credential( "<db_username>", "<authenticationDb>", "<db_password>".toCharArray() ) val settings = MongoClientSettings.builder() .applyToClusterSettings { builder: ClusterSettings.Builder -> builder.hosts( listOf(ServerAddress("<hostname>", "<port>")) ) } .credential(credential) .build() val mongoClient = MongoClient.create(settings)
MONGODB-CR
MONGODB-CR
是一种使用您的用户名和密码进行认证的挑战-响应认证机制。从 MongoDB 3.6 开始,此认证机制已被弃用,MongoDB 4.0 及以后版本不再支持。
您不能显式指定此方法;请参阅使用 MONGODB-CR
连接的默认认证机制提供的回退。
MONGODB-AWS
注意
MONGODB-AWS 身份验证机制适用于 MongoDB Atlas 上的 MongoDB 部署。
MONGODB-AWS
身份验证机制使用您的 Amazon Web Services Identity and Access Management (AWS IAM) 凭据来验证用户。有关配置 MongoDB Atlas 的更多信息,请参阅使用 AWS IAM 角色设置无密码身份验证指南。
要指示驱动程序使用此身份验证机制,您可以在连接字符串中指定 MONGODB-AWS
,或使用 MongoCredential.createAwsCredential()
工厂方法。
在下一节中,您将了解如何指定此身份验证机制以及提供您的 AWS IAM 凭据的多种方式。
这些部分包含使用以下占位符的代码示例
awsKeyId
- 您的 AWS 访问密钥 ID 的值awsSecretKey
- 您的 AWS 秘密访问密钥的值atlasUri
- 您 MongoDB Atlas 部署的网络地址hostname
- 您 MongoDB Atlas 部署的主机名port
- 您 MongoDB Atlas 部署的端口号awsSessionToken
- 您的 AWS 会话令牌的值
AWS SDK
您可以使用 AWS SDK for Java v1 或 v2 之一来指定您的凭据。此方法提供以下功能
多种获取凭据的选项
凭据缓存,有助于您的应用程序避免速率限制
用于与弹性Kubernetes服务配合使用的凭证提供者管理。
要使用Java的AWS SDK进行MONGODB-AWS认证,必须执行以下操作:
指定认证机制
将SDK添加到你的项目中作为依赖
使用凭证提供者链中的方法之一提供你的凭证
要使用MongoCredential
指定认证机制,请使用MongoCredential.createAwsCredential()
工厂方法,并将MongoCredential
实例添加到你的MongoClient
中,如下例所示
val credential = MongoCredential.createAwsCredential(null, null) val settings = MongoClientSettings.builder() .applyToClusterSettings { builder: ClusterSettings.Builder -> builder.hosts( listOf(ServerAddress("<atlasUri>")) ) } .credential(credential) .build() val mongoClient = MongoClient.create(settings)
要在连接字符串中指定认证机制,请按以下示例添加参数
val mongoClient = MongoClient.create("mongodb://<atlasUri>?authMechanism=MONGODB-AWS")
要将AWS SDK添加到你的项目中,请参阅以下AWS文档中所需的版本
注意
对于 AWS SDK for Java v2,Java 驱动目前使用 software.amazon.awssdk:auth:2.18.9
依赖项进行测试。
对于 AWS SDK for Java v1,Java 驱动目前使用 com.amazonaws:aws-java-sdk-core:1.12.337
依赖项进行测试。
要提供您的凭证,请参阅以下 AWS 文档以获取您所需的版本:
要了解更多关于驱动程序使用的 AWS SDK for Java v2 类以获取凭证的信息,请参阅DefaultCredentialsProvider API 文档。
有关如何向此类提供凭证的信息,请参阅使用默认凭证提供链部分。
要了解更多关于驱动程序使用以获取凭证的 AWS SDK for Java v1 类的信息,请参阅 DefaultAWSCredentialsProviderChain API 文档。
有关如何向此类提供凭证的信息,请参阅 使用默认凭证提供链 部分。
注意
如果你的项目中同时包含了 AWS SDK for Java 的 v1 和 v2 版本,你必须使用 v2 方法来提供你的凭证。
在环境中指定您的凭证
您可以通过指示驱动程序使用 MONGODB-AWS
身份验证机制并设置适当的环境变量来提供您的 AWS IAM 凭证。
要使用环境变量提供您的凭据,您必须执行以下操作:
指定认证机制
添加适当的环境变量
您可以通过使用MongoCredential
或连接字符串来指定身份验证机制。
要使用MongoCredential
指定认证机制,请使用MongoCredential.createAwsCredential()
工厂方法,并将MongoCredential
实例添加到你的MongoClient
中,如下例所示
val credential = MongoCredential.createAwsCredential(null, null) val settings = MongoClientSettings.builder() .applyToClusterSettings { builder: ClusterSettings.Builder -> builder.hosts( listOf(ServerAddress("<atlasUri>")) ) } .credential(credential) .build() val mongoClient = MongoClient.create(settings)
要在连接字符串中指定认证机制,请按以下示例添加参数
val mongoClient = MongoClient.create("mongodb://<atlasUri>?authMechanism=MONGODB-AWS")
以下示例显示了如何通过设置以下类型身份验证的环境变量来提供您的凭据
程序化访问密钥
ECS容器凭据
EC2容器凭据
以下示例显示了您如何通过使用bash
或类似shell来设置环境变量中的程序化访问密钥
export AWS_ACCESS_KEY_ID=<awsKeyId> export AWS_SECRET_ACCESS_KEY=<awsSecretKey> export AWS_SESSION_TOKEN=<awsSessionToken>
如果不需要为该角色提供AWS会话令牌,请省略包含AWS_SESSION_TOKEN
的行。
要使用ECS容器凭据进行身份验证,请使用bash
或类似shell设置ECS端点的相对URI,如下例所示
export AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=<your ECS endpoint>
要使用EC2容器凭据进行身份验证,请确保未设置上述任何环境变量。驱动程序将从默认IPv4 EC2实例元数据端点获取凭据。
在MongoCredential中指定您的凭据
您可以使用MongoCredential
实例将AWS IAM凭据提供给MongoClient
。要构建用于MONGODB-AWS
身份验证的MongoCredential
实例,请使用createAwsCredential()工厂方法。
您只能向MongoCredential.createAwsCredential()
方法提供程序化访问密钥。如果您需要提供ECS或EC2容器凭据,请使用指定环境中的凭据或AWS SDK中的说明。
要使用MongoCredential
进行MONGODB-AWS
身份验证,您必须执行以下操作
指定认证机制
提供凭据
要使用MongoCredential
指定认证机制,请使用MongoCredential.createAwsCredential()
工厂方法,并将MongoCredential
实例添加到你的MongoClient
中,如下例所示
val credential = MongoCredential.createAwsCredential("<awsKeyId>", "<awsSecretKey>".toCharArray()) val settings = MongoClientSettings.builder() .applyToClusterSettings { builder: ClusterSettings.Builder -> builder.hosts( listOf(ServerAddress("<atlasUri>")) ) } .credential(credential) .build() val mongoClient = MongoClient.create(settings)
如果您需要指定一个AWS会话令牌,请将其传递给withMechanismProperty()方法,如下例所示
val credential = MongoCredential.createAwsCredential("<awsKeyId>", "<awsSecretKey>".toCharArray()) .withMechanismProperty("AWS_SESSION_TOKEN", "<awsSessionToken>") val settings = MongoClientSettings.builder() .applyToClusterSettings { builder: ClusterSettings.Builder -> builder.hosts( listOf(ServerAddress("<atlasUri>")) ) } .credential(credential) .build() val mongoClient = MongoClient.create(settings)
要刷新您的凭据,您可以声明一个返回新凭据的Supplier
lambda表达式,如下例所示
val awsFreshCredentialSupplier: Supplier<AwsCredential> = Supplier { // Add your code here to fetch new credentials // Return the new credentials AwsCredential("<awsKeyId>", "<awsSecretKey>", "<awsSessionToken>") } val credential = MongoCredential.createAwsCredential("<awsKeyId>", "<awsSecretKey>".toCharArray()) .withMechanismProperty(MongoCredential.AWS_CREDENTIAL_PROVIDER_KEY, awsFreshCredentialSupplier) val settings = MongoClientSettings.builder() .applyToClusterSettings { builder -> builder.hosts(listOf(ServerAddress("<hostname>", "<port>"))) } .credential(credential) .build() val mongoClient = MongoClient.create(settings)
如果您必须在连接字符串中提供AWS IAM凭据,您可以通过调用applyConnectionString()方法将其添加到您的MongoClientSettings
val credential = MongoCredential.createAwsCredential("<awsKeyId>", "<awsSecretKey>".toCharArray()) val connectionString = ConnectionString("mongodb://<atlasUri>/?authMechanism=MONGODB-AWS&authMechanismProperties=AWS_SESSION_TOKEN:<awsSessionToken>") val settings = MongoClientSettings.builder() .applyConnectionString(connectionString) .credential(credential) .build() val mongoClient = MongoClient.create(settings)
X.509
使用 X.509
认证机制,通过 TLS 与 X.509 证书来认证用户,用户通过客户端证书的相关区分名(RDN)进行标识。当指定 X.509
认证机制时,服务器使用客户端证书的主题名称进行连接认证。
以下代码片段显示了如何指定身份验证机制,使用以下占位符
hostname
- 您的MongoDB服务器可由客户端访问的网络地址。port
- 您的MongoDB服务器的端口号。authenticationDb
- 包含您的用户身份验证数据的MongoDB数据库。如果您省略此参数,驱动程序使用默认值admin
。
选择下面的 连接字符串 或 MongoCredential 选项卡以获取指定此身份验证机制的说明和示例代码
要使用连接字符串指定 X.509
认证机制,将 authMechanism
参数赋值为 MONGODB-X509
,并通过将 tls
参数赋值为 true
来启用 TLS。您实例化 MongoClient
的代码应类似于以下内容
val mongoClient = MongoClient.create("mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=<authenticationDb>&authMechanism=MONGODB-X509&tls=true")
要使用 MongoCredential
类指定 X.509
认证机制,请使用 createMongoX509Credential() 方法。此外,通过调用 applyToSslSettings() 方法,并将 enabled
属性设置为 true
在 SslSettings.Builder 块中启用 TLS。您的代码实例化 MongoClient
应类似于以下内容
val credential = MongoCredential.createMongoX509Credential() val settings = MongoClientSettings.builder() .applyToClusterSettings { builder -> builder.hosts(listOf( ServerAddress("<hostname>", "<port>")) ) } .applyToSslSettings { builder -> builder.enabled(true) } .credential(credential) .build() val mongoClient = MongoClient.create(settings)
有关配置应用程序使用证书以及 TLS/SSL 选项的更多信息,请参阅我们的 TLS/SSL 指南。