身份验证
在本指南中,您可以了解如何使用 MongoDB Community Edition 提供的身份验证机制对 MongoDB 进行身份验证。身份验证机制是驱动程序和服务器在连接之前确认客户端身份以确保安全的过程。
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证书对客户端进行身份验证 ”教程,了解有关从证书确定主题名称的更多信息。