该驱动程序支持所有 MongoDB 身份验证机制,包括仅在 MongoDB Enterprise 版中提供的机制。
MongoCredential
包括以下 import 语句:
import org.mongodb.scala._ import scala.collection.JavaConverters._
身份验证档案表示为 MongoCredential类的实例。 MongoCredential类包含每种受支持的身份验证机制的辅助方法。
默认身份验证机制
在 MongoDB 3.0中, MongoDB 将默认身份验证机制从MONGODB-CR更改为SCRAM-SHA-1 。 在 MongoDB 4.0中,删除了对已弃用的MONGODB-CR机制的支持,并添加了SCRAM-SHA-256支持。
要创建使用默认身份验证机制进行身份验证的档案(无论服务器版本如何),请使用createCredential()辅助方法创建档案:
val user: String = ... // the user name val source: String = ... // the source where the user is defined val password: Array[Char] = ... // the password as a character array // ... val credential = MongoCredential.createCredential(user, source, password) val mongoClient: MongoClient = MongoClient( MongoClientSettings.builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List(new ServerAddress("host1", 27017)).asJava)) .credential(credential) .build())
或者,您可以使用连接string ,而无需显式指定身份验证机制:
val mongoClient: MongoClient = MongoClient("mongodb://user1:pwd1@host1/?authSource=db1")
对于质询和响应机制,建议使用默认身份验证机制,因为它使得从 MongoDB 2.6升级到 MongoDB 3.0更简单,即使在升级身份验证模式之后也是如此。 对于 MongoDB 4.0用户,还建议使用默认身份验证机制,因为会检查该机制并使用正确的哈希算法。
基于 SCRAM 的机制
自 3.0 以来,Salted 挑战-响应身份验证机制 (SCRAM) 一直是MongoDB的默认身份验证机制。SCRAM 基于 IETF RFC 5802 标准,该标准定义了实施使用密码对用户进行身份验证的质询-响应机制的最佳实践。
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()方法:
val user: String = ... // the user name val source: String = ... // the source where the user is defined val password: Array[Char] = ... // the password as a character array // ... val credential = MongoCredential.createScramSha256Credential(user, source, password) val mongoClient: MongoClient = MongoClient( MongoClientSettings.builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List(new ServerAddress("host1", 27017)).asJava)) .credential(credential) .build())
或者,您可以使用显式指定 authMechanism=SCRAM-SHA-256 的连接string :
val mongoClient: MongoClient = MongoClient("mongodb://user1:pwd1@host1/?authSource=db1&authMechanism=SCRAM-SHA-256")
SCRAM-SHA-1
要显式创建类型为SCRAM-SHA-1的档案,请使用createScramSha1Credential()方法:
val user: String = ... // the user name val source: String = ... // the source where the user is defined val password: Array[Char] = ... // the password as a character array // ... val credential = MongoCredential.createScramSha1Credential(user, source, password) val mongoClient: MongoClient = MongoClient( MongoClientSettings.builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List(new ServerAddress("host1", 27017)).asJava)) .credential(credential) .build())
或者,您可以使用显式指定 authMechanism=SCRAM-SHA-1 的连接string :
val mongoClient: MongoClient = MongoClient("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()辅助方法:
val user: String = ... // the user name val source: String = ... // the source where the user is defined val password: Array[Char] = ... // the password as a character array // ... val credential = MongoCredential.createMongoCRCredential(user, database, password) val mongoClient: MongoClient = MongoClient( MongoClientSettings.builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List(new ServerAddress("host1", 27017)).asJava)) .credential(credential) .build())
或者,您可以使用显式指定 authMechanism=MONGODB-CR 的连接string :
val mongoClient: MongoClient = MongoClient("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()辅助方法:
val user: String = ... // The X.509 certificate derived user name, e.g. "CN=user,OU=OrgUnit,O=myOrg,..." // ... val credential = MongoCredential.createMongoX509Credential(user) val mongoClient: MongoClient = MongoClient( MongoClientSettings.builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List(new ServerAddress("host1", 27017)).asJava)) .credential(credential) .build())
或者,您可以使用显式指定 authMechanism=MONGODB-X509 的连接string :
val mongoClient: MongoClient = MongoClient("mongodb://subjectName@host1/?authMechanism=MONGODB-X509&ssl=true")
请参阅 手册中的“ 使用 x.509 MongoDB Server证书对客户端进行身份验证 ”教程,了解有关从证书确定主题名称的更多信息。
Kerberos (GSSAPI)
MongoDB Enterprise 支持通过 Kerberos 服务进行代理身份验证。 要创建 Kerberos (GSSAPI) 类型的档案,请使用createGSSAPICredential()辅助方法:
val user: String = ... // The Kerberos user name, including the realm, e.g. "user1@MYREALM.ME" // ... val credential = MongoCredential.createGSSAPICredential(user) val mongoClient: MongoClient = MongoClient( MongoClientSettings.builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List(new ServerAddress("host1", 27017)).asJava)) .credential(credential) .build())
或者,您可以使用显式指定 authMechanism=GSSAPI 的连接string :
val mongoClient: MongoClient = MongoClient("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_NAMECANONICALIZE_HOST_NAMEJAVA_SUBJECTJAVA_SASL_CLIENT_PROPERTIES
以下代码展示了如何在MongoCredential对象中指定SERVICE_NAME属性:
val credentialWithProperty = credential.withMechanismProperty(MongoCredential.SERVICE_NAME_KEY, "othername")
或者,您可以在ConnectionString中指定SERVICE_NAME属性:
val uri = "mongodb://username%40MYREALM.com@myserver/?authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:othername"
LDAP (Plain)
MongoDB Enterprise 支持通过轻量级目录访问协议 (LDAP) 服务进行代理身份验证。 要创建类型为LDAP的档案,请使用createPlainCredential()辅助方法:
val user: String = ... // The LDAP user name val password: Array[Char] = ... // The LDAP password // ... val credential = MongoCredential.createPlainCredential(user, "$external", password) val mongoClient: MongoClient = MongoClient( MongoClientSettings.builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List(new ServerAddress("host1", 27017)).asJava)) .credential(credential) .build())
或者,您可以使用显式指定 authMechanism=PLAIN 的连接string :
val mongoClient: MongoClient = MongoClient("mongodb://user1@host1/?authSource=$external&authMechanism=PLAIN")
注意
该方法引用PLAIN身份验证机制而不是LDAP ,因为驱动程序使用PLAIN SASL 机制进行身份验证。