文档菜单
文档首页
/ / /
Scala
/ /

身份验证

本页内容

  • MongoCredential
  • 默认身份验证机制
  • 基于SCRAM的机制
  • SCRAM-SHA-256
  • SCRAM-SHA-1
  • MONGODB-CR
  • X.509
  • Kerberos (GSSAPI)
  • LDAP (PLAIN)

驱动程序支持所有MongoDB认证机制,包括仅MongoDB企业版中可用的认证机制。

包括以下导入语句

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())

或者,您可以使用不明确指定认证机制的连接字符串

val mongoClient: MongoClient = MongoClient("mongodb://user1:pwd1@host1/?authSource=db1")

对于挑战和响应机制,使用默认认证机制是推荐的方法,因为它使得从MongoDB 2.6升级到MongoDB 3.0更加简单,甚至在升级了认证方案之后也是如此。对于MongoDB 4.0用户,使用默认认证机制也是推荐的,因为机制被检查,并使用了正确的哈希算法。

盐值挑战-响应认证机制(SCRAM)自MongoDB 3.0以来一直是默认的认证机制。 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()方法

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的连接字符串

val mongoClient: MongoClient = MongoClient("mongodb://user1:pwd1@host1/?authSource=db1&authMechanism=SCRAM-SHA-256")

要显式创建类型为 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 的连接字符串

val mongoClient: MongoClient = MongoClient("mongodb://user1:pwd1@host1/?authSource=db1&authMechanism=SCRAM-SHA-1")

重要

从版本 4.0 开始,MongoDB 移除了对已弃用的 MongoDB 挑战-响应 (MONGODB-CR) 身份验证机制的 support。

如果您的部署中存储了 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 的连接字符串

val mongoClient: MongoClient = MongoClient("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() 辅助方法

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 的连接字符串。

val mongoClient: MongoClient = MongoClient("mongodb://subjectName@host1/?authMechanism=MONGODB-X509&ssl=true")

请参阅服务器手册中的使用 x.509 证书来验证客户端教程,了解如何从证书中确定主题名称。

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 的连接字符串。

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_NAME

  • CANONICALIZE_HOST_NAME

  • JAVA_SUBJECT

  • JAVA_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"

注意

在Windows系统中,Oracle JRE使用LSA而不是SSPI来实现GSSAPI,这限制了与Windows Active Directory的互操作性,特别是实现单点登录的能力。

MongoDB企业版支持通过轻量级目录访问协议(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的连接字符串

val mongoClient: MongoClient = MongoClient("mongodb://user1@host1/?authSource=$external&authMechanism=PLAIN")

注意

该方法指的是PLAIN认证机制而不是LDAP,因为驱动程序通过使用PLAIN SASL机制进行认证。

返回

TLS/SSL