文档菜单
文档首页
/ / /
Java反应式流驱动程序
/

身份验证

本页内容

  • MongoCredential
  • 默认身份验证机制
  • 基于 SCRAM 的机制
  • SCRAM-SHA-256
  • SCRAM-SHA-1
  • MONGODB-CR
  • X.509

在本指南中,您可以了解如何使用 MongoDB 社区版中可用的身份验证机制对 MongoDB 进行身份验证。身份验证机制是驱动程序和服务器确认客户端身份的过程,以确保连接前的安全性。

包含以下导入语句

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)自MongoDB 3.0以来一直是MongoDB的默认认证机制。SCRAM基于IETF RFC 5802 定义了使用密码验证用户时挑战-响应机制的最佳实践的标准。

MongoDB 3.0 引入了对 SCRAM-SHA-1 的支持,它使用 SHA-1 哈希函数。MongoDB 4.0 引入了对 SCRAM-SHA-256 的支持,它使用 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 的凭据,请使用 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");

重要

从版本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机制,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证书来认证客户端教程,了解更多关于从证书确定主题名称的信息。

返回

安全性