Overview
通用安全服务API (GSSAPI)身份验证机制允许您通过指定Kerberos主体名称来对Kerberos服务进行身份验证。
注意
术语
GSSAPI当引用身份验证机制时,页面使用Kerberos ;当引用根本的协议或服务时,页面使用 。驾驶员使用 GSSAPI RFC-4752 SASL 机制进行身份验证,该机制构建在Kerberos协议之上。
指定Kerberos身份验证
以下部分包含使用以下占位符值的代码示例:
<username>: URL编码的主体名称,例如"username%40REALM.ME"<hostname>: MongoDB 部署的网络解决,可由客户端访问<port>: MongoDB 部署的端口号
选择下面的 Connection String(连接字符串)或 MongoCredential 标签页,以获取指定此身份验证机制的说明和示例代码:
以下示例使用连接string对 GSSAPI 进行身份验证:
MongoClient mongoClient = MongoClients .create("<username>@<hostname>:<port>/?authSource=$external&authMechanism=GSSAPI");
要使用MongoCredential类指定 GSSAPI身份验证机制,请调用createGSSAPICredential()方法,如以下示例所示:
MongoCredential credential = MongoCredential.createGSSAPICredential("<username>"); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
获取Kerberos票证
要获取Kerberos票证,GSSAPI Java库要求您指定域和密钥分发中心 (KDC) Java虚拟机(JVM)系统属性。以下示例展示了如何设立这些属性:
java.security.krb5.realm=MYREALM.ME java.security.krb5.kdc=mykdc.myrealm.me
设置其他属性
您可能需要指定以下一个或多个附加身份验证机制属性,具体取决于您的Kerberos设置:
SERVICE_NAMECANONICALIZE_HOST_NAMEJAVA_SUBJECTJAVA_SASL_CLIENT_PROPERTIESJAVA_SUBJECT_PROVIDER
选择下面的 Connection String 或 MongoCredential标签页,查看指定这些属性的说明和示例代码:
要指定 GSSAPI 其他属性,请将该属性作为 <PROPERTY_NAME>:<value> 格式的URL参数包含在连接字符串中。
以下示例对 GSSAPI 进行身份验证并指定 SERVICE_NAME属性:
MongoClient mongoClient = MongoClients .create("<username>@<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 常量:
MongoCredential credential = MongoCredential .createGSSAPICredential("<username>"); credential = credential .withMechanismProperty(MongoCredential.SERVICE_NAME_KEY, "<myService>");
JAVA_SUBJECT_KEY属性需要一个 javax.security.auth.Subject对象。要检索Subject,必须首先使用 LoginContext 通过Java身份验证和授权服务 (JAAS) 进行身份验证。以下示例展示了此配置:
LoginContext loginContext = new LoginContext(<LoginModule implementation from JAAS config>); loginContext.login(); Subject subject = loginContext.getSubject(); MongoCredential credential = MongoCredential .createGSSAPICredential("<username>"); credential = credential .withMechanismProperty(MongoCredential.JAVA_SUBJECT_KEY, subject);
配置票证缓存
默认下, Java Reactive Streams驾驶员按创建 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 */ String myLoginContext = "myContext"; MongoCredential credential = MongoCredential .createGSSAPICredential("<username>"); /* Login context defaults to "com.sun.security.jgss.krb5.initiate" if unspecified in KerberosSubjectProvider */ credential = credential .withMechanismProperty(MongoCredential.JAVA_SUBJECT_PROVIDER_KEY, new KerberosSubjectProvider(myLoginContext));
更多信息
要学习;了解有关向MongoDB进行身份验证的更多信息,请参阅MongoDB Server手册中的身份验证。
MongoClient要学习;了解有关使用Java Reactive Streams驾驶员创建 对象的更多信息,请参阅“连接到MongoDB”指南。
API 文档
要学习;了解有关本指南中提到的类和方法的更多信息,请参阅以下API文档: