身份验证
在此页面上
该驱动程序支持所有 MongoDB 身份验证机制,包括仅在 MongoDB Enterprise 版中提供的机制。
MongoCredential
包括以下 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用户,还建议使用默认身份验证机制,因为会检查该机制并使用正确的哈希算法。
基于 SCRAM 的机制
自3.0以来,Salted 挑战-响应身份验证机制 ( SCRAM
) 一直是 MongoDB 的默认身份验证机制。 SCRAM
基于 IETF RFC5802 标准,该标准定义了实施使用密码对用户进行身份验证的挑战-响应机制的最佳实践。
MongoDB 3.0引入了对SCRAM-SHA-1
的支持,它使用SHA-1
哈希函数。 MongoDB 4.0引入了对使用SHA-256
哈希函数的SCRAM-
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
要显式创建类型为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");
MONGODB-CR
重要
从版本 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
通过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证书对客户端进行身份验证 ”教程,了解有关从证书确定主题名称的更多信息。
Kerberos (GSSAPI)
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"
LDAP (Plain)
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 机制进行身份验证。