身份验证
在本指南中,您可以了解如何使用 MongoDB 社区版中可用的身份验证机制对 MongoDB 进行身份验证。身份验证机制是驱动程序和服务器确认客户端身份的过程,以确保连接前的安全性。
mongo凭证
包含以下导入语句
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的机制
基于盐值的挑战-响应认证机制(SCRAM
)自MongoDB 3.0以来一直是MongoDB的默认认证机制。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挑战-响应(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证书来认证客户端教程,了解更多关于从证书确定主题名称的信息。