身份验证机制
Overview
在本指南中,您可以了解如何使用 MongoDB Community Edition 提供的每个身份验证机制对 MongoDB 进行身份验证。身份验证机制是驱动程序和 MongoDB 部署确认身份并建立信任以确保安全的过程。
可以在最新版本的 MongoDB Community Edition 中使用如下机制:
要使用 Kerberos
或LDAP
进行身份验证,请参阅《 企业身份验证机制》指南。 有关建立与MongoDB 集群连接的更多信息,请阅读我们的连接指南。
指定身份验证机制
您可以使用以下任一方式在连接到 MongoDB 时指定身份验证机制和凭据:
连接字符串
MongoCredential
工厂方法
连接字符串(也称为连接 uri)指定如何连接到 MongoDB 集群并对其进行身份验证。
要使用连接字符串进行身份验证,请将您的设置包含在连接字符串中并将其传递给MongoClients.create()
方法以实例化您的MongoClient
。选择 Connection String选项卡以查看使用连接字符串进行身份验证的事务语法。
或者,您可以使用 MongoCredential
类指定身份验证详细信息。MongoCredential
类包含静态工厂方法,可构造包含身份验证机制和档案的实例。使用 MongoCredential
辅助类时,您需要在构造 MongoClient
时使用 MongoClientSettings.Builder
类来配置连接设置。选择 MongoCredential 标签页,查看使用 MongoCredential
进行身份验证的事务语法。
有关这些类和方法的更多信息,请参阅以下 API 文档:
机制
默认
默认身份验证机制设置使用以下身份验证机制之一,具体取决于您的 MongoDB Server 版本支持的版本:
SCRAM-SHA-256
SCRAM-SHA-1
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
注意
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
注意
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-CR
是一种挑战-响应身份验证机制,它使用您的用户名和密码
来验证您的用户。 从 MongoDB 3.6 开始,这种身份验证机制已被弃用,
从 MongoDB 4.0 开始不再支持。
您无法明确指定此方法;请参阅默认身份验证机制提供的备用机制,以使用 MONGODB-CR
进行连接。
MONGODB-AWS
注意
MongoDB Atlas中提供了 MONGODB-AWS身份验证机制。
MONGODB-AWS
身份验证机制使用 Amazon Web Services Identity and Access Management (AWS IAM) 档案对用户进行身份验证。
您可以存储Amazon Web Services凭证存储为环境变量,也可以内联插入这些凭证,如以下示例所示。 驾驶员会按以下顺序检查您的凭证:
在
MongoCredential
对象或所提供的连接string中提供的值。您的环境变量。 (
AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
和可选的AWS_SESSION_TOKEN
)AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
环境变量中指定的Amazon Web Services EC2 端点。默认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-AWS
MongoCredential
要使用 类指定 身份验证机制,请使用 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
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.509
MongoCredential
要使用 类指定 身份验证机制,请使用 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 指南。