身份验证
本页内容
驱动程序支持所有MongoDB认证机制,包括仅MongoDB企业版中可用的认证机制。
MongoCredential
包括以下导入语句
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的机制
盐值挑战-响应认证机制(SCRAM
)自MongoDB 3.0以来一直是默认的认证机制。 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()
方法
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
要显式创建类型为 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")
MONGODB-CR
重要
从版本 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
使用 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 证书来验证客户端教程,了解如何从证书中确定主题名称。
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
的连接字符串。
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"
LDAP (PLAIN)
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机制进行认证。