文档菜单
文档首页
/ / /
Java 反应式流驱动程序
/ /

身份验证

本页内容

  • MongoCredential
  • 默认身份验证机制
  • 基于 SCRAM 的机制
  • SCRAM-SHA-256
  • SCRAM-SHA-1
  • MONGODB-CR
  • X.509
  • Kerberos (GSSAPI)
  • LDAP (PLAIN)

驱动程序支持所有 MongoDB 身份验证机制,包括仅在 MongoDB 企业版中可用的机制。

包含以下导入语句

import com.mongodb.MongoCredential;
import com.mongodb.ConnectionString;
import com.mongodb.reactivestreams.client.MongoClients;
import com.mongodb.reactivestreams.client.MongoClient;

身份验证凭据表示为MongoCredential 类。该 MongoCredential 类包含用于每个支持的认证机制的静态工厂方法。

在 MongoDB 3.0 中,MongoDB 将默认认证机制从 MONGODB-CR 更改为 SCRAM-SHA-1。在 MongoDB 4.0 中,移除了对已弃用的 MONGODB-CR 机制的支持,并增加了对 SCRAM-SHA-256 的支持。

要创建一个使用默认认证机制的凭证,无论服务器版本如何,请使用 createCredential() 静态工厂方法创建凭证

String user; // the user name
String source; // the source where the user is defined
char[] password; // the password as a character array
// ...
MongoCredential credential = MongoCredential.createCredential(user, source, password);
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("host1", 27017))))
.credential(credential)
.build());

或者,您可以使用不显式指定认证机制的连接字符串

MongoClient mongoClient = MongoClients.create("mongodb://user1:pwd1@host1/?authSource=db1");

对于挑战和响应机制,使用默认认证机制是推荐的方法,因为它使得从 MongoDB 2.6 升级到 MongoDB 3.0 更加简单,即使在升级认证方案之后。对于 MongoDB 4.0 用户,也推荐使用默认认证机制,因为机制已进行检查,并使用了正确的散列算法。

基于 Salted Challenge-Response Authentication Mechanism (SCRAM) 的认证机制自 MongoDB 3.0 以来一直是默认的认证机制。 SCRAM 基于以下内容IETF RFC 5802 标准定义了使用密码进行用户身份验证的挑战-响应机制的最佳实践。

MongoDB 3.0 引入了对 SCRAM-SHA-1 的支持,它使用 SHA-1 哈希函数。MongoDB 4.0 引入了对 SCRAM-SHA-256 的支持,它使用 SHA-256 哈希函数。

使用此机制需要 MongoDB 4.0,并将 featureCompatibilityVersion 设置为 4.0。

要显式创建类型为 SCRAM-SHA-256 的凭证,请使用 createScramSha256Credential() 方法

String user; // the user name
String source; // the source where the user is defined
char[] password; // the password as a character array
// ...
MongoCredential credential = MongoCredential.createScramSha256Credential(user, source, password);
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("host1", 27017))))
.credential(credential)
.build());

或者,您可以使用显式指定 authMechanism=SCRAM-SHA-256 的连接字符串

MongoClient mongoClient = MongoClients.create("mongodb://user1:pwd1@host1/?authSource=db1&authMechanism=SCRAM-SHA-256");

要显式创建类型为 SCRAM-SHA-1 的凭证,请使用 createScramSha1Credential() 方法

String user; // the user name
String source; // the source where the user is defined
char[] password; // the password as a character array
// ...
MongoCredential credential = MongoCredential.createScramSha1Credential(user, source, password);
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("host1", 27017))))
.credential(credential)
.build());

或者,您可以使用显式指定authMechanism=SCRAM-SHA-1的连接字符串。

MongoClient mongoClient = MongoClients.create("mongodb://user1:pwd1@host1/?authSource=db1&authMechanism=SCRAM-SHA-1");

重要

从版本4.0开始,MongoDB移除了对已弃用的MongoDB Challenge-Response (MONGODB-CR)认证机制的 支持。

如果您的部署中存储了MONGODB-CR模式的用户凭据,您必须在升级到4.0版本之前升级到基于SCRAM的机制。

要显式创建类型为MONGODB-CR的凭据,请使用createMongCRCredential()静态工厂方法

String user; // the user name
String database; // the name of the database in which the user is defined
char[] password; // the password as a character array
// ...
MongoCredential credential = MongoCredential.createMongoCRCredential(user, database, password);
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("host1", 27017))))
.credential(credential)
.build());

或者,您可以使用显式指定authMechanism=MONGODB-CR的连接字符串

MongoClient mongoClient = MongoClients.create("mongodb://user1:pwd1@host1/?authSource=db1&authMechanism=MONGODB-CR");

注意

将认证模式从MONGODB-CR升级到SCRAM后,MONGODB-CR凭据将无法通过认证。

使用X.509机制时,MongoDB使用SSL协商期间提供的X.509证书来认证用户,用户的名称来自X.509证书的区分名称。

X.509认证需要使用带证书验证的SSL连接。要创建此类凭据,请使用createMongoX509Credential()静态工厂方法

String user; // The X.509 certificate derived user name, e.g. "CN=user,OU=OrgUnit,O=myOrg,..."
// ...
MongoCredential credential = MongoCredential.createMongoX509Credential(user);
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("host1", 27017))))
.credential(credential)
.build());

或者,您可以使用显式指定authMechanism=MONGODB-X509的连接字符串

MongoClient mongoClient = MongoClients.create("mongodb://subjectName@host1/?authMechanism=MONGODB-X509&ssl=true");

请参阅服务器手册中的使用X.509证书认证客户端教程,了解更多关于从证书中确定主题名称的信息。

MongoDB企业版支持通过Kerberos服务进行代理身份验证。要创建类型为Kerberos (GSSAPI)的凭据,请使用createGSSAPICredential()静态工厂方法

String user; // The Kerberos user name, including the realm, e.g. "user1@MYREALM.ME"
// ...
MongoCredential credential = MongoCredential.createGSSAPICredential(user);
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("host1", 27017))))
.credential(credential)
.build());

或者,您可以使用显式指定authMechanism=GSSAPI的连接字符串

MongoClient mongoClient = MongoClients.create("mongodb://username%40REALM.ME@host1/?authMechanism=GSSAPI");

注意

此方法引用的是GSSAPI身份验证机制而不是Kerberos,因为驱动程序通过使用GSSAPI SASL机制进行身份验证。

要成功使用Kerberos进行身份验证,应用程序通常必须指定几个系统属性,以便底层的GSSAPI Java库可以获取Kerberos票据

java.security.krb5.realm=MYREALM.ME
java.security.krb5.kdc=mykdc.myrealm.me

根据Kerberos设置,可能需要额外的属性指定,这些指定可能位于应用程序代码中,或者在某些情况下,通过使用MongoCredential实例的withMechanismProperty()方法进行

  • SERVICE_NAME

  • CANONICALIZE_HOST_NAME

  • JAVA_SUBJECT

  • JAVA_SASL_CLIENT_PROPERTIES

以下代码展示了如何在MongoCredential对象中指定SERVICE_NAME属性

credential = credential.withMechanismProperty(MongoCredential.SERVICE_NAME_KEY, "othername");

或者,您可以在ConnectionString中指定SERVICE_NAME属性

uri = "mongodb://username%40MYREALM.com@myserver/?authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:othername"

注意

在Windows操作系统中,Oracle JRE在实现GSSAPI时使用的是LSA,而不是SSPI,这限制了与Windows Active Directory的互操作性,特别是实现单点登录的能力。

MongoDB企业版支持通过轻量级目录访问协议(LDAP)服务进行代理身份验证。要创建类型为LDAP的凭据,请使用createPlainCredential()静态工厂方法。

String user; // The LDAP user name
char[] password; // The LDAP password
// ...
MongoCredential credential = MongoCredential.createPlainCredential(user, "$external", password);
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(new ServerAddress("host1", 27017))))
.credential(credential)
.build());

或者,您可以使用显式指定authMechanism=PLAIN的连接字符串。

MongoClient mongoClient = MongoClients.create("mongodb://user1@host1/?authSource=$external&authMechanism=PLAIN");

注意

该方法引用的是PLAIN身份验证机制,而不是LDAP,因为驱动程序使用PLAIN SASL机制进行身份验证。

返回

TLS/SSL