Docs 菜单
Docs 主页
/ / /
Java Reactive Streams 驱动程序
/ /

身份验证

在此页面上

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

该驱动程序支持所有 MongoDB 身份验证机制,包括仅在 MongoDB Enterprise 版中提供的机制。

包括以下 import 语句:

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());

或者,您可以使用连接string ,而无需显式指定身份验证机制:

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

对于质询和响应机制,建议使用默认身份验证机制,因为它使得从 MongoDB 2.6升级到 MongoDB 3.0更简单,即使在升级身份验证模式之后也是如此。 对于 MongoDB 4.0用户,还建议使用默认身份验证机制,因为会检查该机制并使用正确的哈希算法。

自3.0以来,Salted 挑战-响应身份验证机制 ( SCRAM ) 一直是 MongoDB 的默认身份验证机制。 SCRAM基于 IETF RFC5802 标准,该标准定义了实施使用密码对用户进行身份验证的挑战-响应机制的最佳实践。

MongoDB 3.0引入了对SCRAM-SHA-1的支持,它使用SHA-1哈希函数。 MongoDB 4.0引入了对使用SHA-256哈希函数的SCRAM- 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 的连接string :

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 的连接string :

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

重要

从版本 4.0 开始,MongoDB 删除了对已弃用的 MongoDB 挑战-响应 ( MONGODB-CR ) 身份验证机制的支持。

如果您的部署将用户档案存储在MONGODB-CR模式中,则必须先升级以使用基于SCRAM的机制,然后再升级到版本4.0 。

要显式创建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 的连接string :

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 的连接string :

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

请参阅 手册中的“ 使用 x.509 MongoDB Server证书对客户端进行身份验证 ”教程,了解有关从证书确定主题名称的更多信息。

MongoDB Enterprise 支持通过 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 的连接string :

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 使用 LSA 而不是 SSPI ,这限制了与 Windows Active Directory 的互操作性,特别是实施单点登录的能力。

MongoDB Enterprise 支持通过轻量级目录访问协议 (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 的连接string :

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

注意

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

后退

TLS/SSL