身份验证
本页内容
驱动程序支持所有 MongoDB 身份验证机制,包括仅在 MongoDB 企业版中可用的机制。
MongoCredential
包含以下导入语句
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 用户,也推荐使用默认认证机制,因为机制已进行检查,并使用了正确的散列算法。
基于 SCRAM 的机制
基于 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
哈希函数。
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
的连接字符串
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
的连接字符串。
MongoClient mongoClient = MongoClients.create("mongodb://user1:pwd1@host1/?authSource=db1&authMechanism=SCRAM-SHA-1");
MONGODB-CR
重要
从版本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
使用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证书认证客户端教程,了解更多关于从证书中确定主题名称的信息。
kerberos (GSSAPI)
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"
LDAP (PLAIN)
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机制进行身份验证。