Overview
通用安全服务API (GSSAPI)身份验证机制允许您通过指定主体名称来对Kerberos服务进行身份验证。
注意
术语
该页面在提及身份验证机制时使用 GSSAPI,在提及底层协议或服务时使用 Kerberos。驱动程序通过使用在 Kerberos 协议之上构建的 GSSAPI RFC-4752 SASL 机制进行身份验证。
指定Kerberos身份验证
本节中的示例展示了如何指定 GSSAPI身份验证机制并使用以下占位符值:
<Kerberos principal>:您的URL编码主体名称。<hostname>:您的MongoDB 部署的网络解决,可由您的客户端访问。<port>: MongoDB 部署的端口号。如果省略此参数,驱动程序将使用默认端口号 (27017)。
选择 Connection String 或 MongoCredential标签页以查看说明和代码示例:
要在连接字符串中指定 GSSAPI身份验证机制,请执行以下操作:
将
authMechanismURL参数设置为GSSAPI。(可选)将
authSourceURL参数设置为$external。
注意
如果指定GSSAPI 机制,则不能将authSource 分配给$external 以外的任何值。
以下示例在连接字符串中指定身份验证机制:
val mongoClient = MongoClient( "mongodb://<Kerberos principal>@<hostname>:<port>/?authSource=$external&authMechanism=GSSAPI" )
要使用 MongoCredential 类指定 GSSAPI身份验证机制,请使用 createGSSAPICredential() 方法,如以下示例所示:
val credential = MongoCredential.createGSSAPICredential("<Kerberos principal>") val mongoClient = MongoClient(MongoClientSettings .builder() .applyToClusterSettings(builder => builder.hosts(List(new ServerAddress("<hostname>", <port>)).asJava)) .credential(credential) .build())
获取Kerberos票证
要获取Kerberos票证,GSSAPI Java库要求您指定域和密钥分发中心 (KDC) 系统属性。
以下代码显示了这些属性的示例值:
java.security.krb5.realm=MYREALM.ME java.security.krb5.kdc=mykdc.myrealm.me
additionalProperties
您可能需要指定以下一个或多个附加的身份验证机制属性,具体取决于 Kerberos 设置:
SERVICE_NAMECANONICALIZE_HOST_NAMEJAVA_SUBJECTJAVA_SASL_CLIENT_PROPERTIESJAVA_SUBJECT_PROVIDER
选择下面的 Connection String 或 MongoCredential 标签页,以获取指定这些属性的说明和示例代码:
要指定 GSSAPI 其他属性,请将该属性作为 URL 参数以 <PROPERTY_NAME>:<value> 格式包含在连接字符串中。
以下示例对 GSSAPI 进行身份验证并指定 SERVICE_NAME 属性:
val mongoClient = MongoClient( "mongodb://<Kerberos principal>@<hostname>:<port>/?authSource=$external&authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:myService" )
重要
您只能使用 MongoCredential 来指定以下 GSSAPI 属性:
JAVA_SUBJECTJAVA_SASL_CLIENT_PROPERTIESJAVA_SUBJECT_PROVIDER
选择MongoCredential标签页,查看如何指定它们。
要指定 GSSAPI 其他属性,请在 MongoCredential实例上调用 withMechanismProperty() 方法,并将属性名称和值作为参数传递。使用 MongoCredential 类中定义的以下属性名称常量:
以下示例对 GSSAPI 进行身份验证并指定 SERVICE_NAME_KEY 常量:
val credential = MongoCredential.createGSSAPICredential("<Kerberos principal>") .withMechanismProperty(MongoCredential.SERVICE_NAME_KEY, "myService")
JAVA_SUBJECT_KEY 属性需要 javax.security.auth.Subject 对象。要检索 Subject,必须首先通过使用 LoginContext 通过 Java 身份验证和授权服务 (JAAS) 进行身份验证。以下示例展示了此配置:
val loginContext = new LoginContext("<LoginModule implementation from JAAS config>") loginContext.login() val subject: Subject = loginContext.getSubject() val credential = MongoCredential.createGSSAPICredential("<Kerberos principal>") .withMechanismProperty(MongoCredential.JAVA_SUBJECT_KEY, subject)
票证缓存
默认下, Scala驾驶员按创建 Kerberos 票证的 MongoClient实例缓存Kerberos票证。如果您的部署经常创建和销毁 MongoClient 实例,则可以通过将默认Kerberos票证缓存行为更改为 按进程缓存来提高性能。
重要
您必须使用 MongoCredential 类来更改默认缓存行为,因为连接字符串身份验证机制不支持 JAVA_SUBJECT_PROVIDER 机制属性。
要按进程缓存Kerberos票证,请指定JAVA_SUBJECT_PROVIDER 机制属性并在 实例中提供 KerberosSubjectProvider,如以下示例所示:MongoCredential
/* All MongoClient instances sharing this instance of KerberosSubjectProvider will share a Kerberos ticket cache */ val myLoginContext = "myContext" /* Login context defaults to "com.sun.security.jgss.krb5.initiate" if unspecified in KerberosSubjectProvider */ val credential = MongoCredential.createGSSAPICredential("<Kerberos principal>") .withMechanismProperty( MongoCredential.JAVA_SUBJECT_PROVIDER_KEY, new KerberosSubjectProvider(myLoginContext) )
注意
在Windows上,Oracle 的 JRE 在实施GSSAPI 时使用 LSA 而不是 SSPI。此行为限制了与Windows Active Directory 的互操作性以及单点登录的实施。要学习;了解详情,请参阅以下资源:
更多信息
要学习;了解有关向MongoDB进行身份验证的更多信息,请参阅MongoDB Server手册中的身份验证。
MongoClient要学习;了解有关使用Scala驾驶员创建 对象的更多信息,请参阅创建 MongoClient指南。
API 文档
要学习;了解有关使用Scala驾驶员对应用程序进行身份验证的类和方法的更多信息,请参阅以下API文档: