Visão geral
O mecanismo de autenticação da API de serviços de segurança genérica (GSSAPI) permite que você autentique em um serviço Kerberos especificando seu nome principal do Kerberos.
Observação
Terminologia
A página utiliza GSSAPI para se referir ao mecanismo de autenticação e Kerberos para se referir ao protocolo ou serviço subjacente. O driver autentica usando o mecanismo GSSAPI RFC-4752 SASL, que é criado sobre o protocolo Kerberos.
Especificar autenticação Kerberos
As seções a seguir contêm amostras de código que usam os seguintes valores de espaço reservado:
<username>: Seu nome principal codificado para URL, como"username%40REALM.ME"<hostname>: O endereço de rede da sua implantação do MongoDB , acessível pelo seu cliente<port>: O número da porta da sua implantação do MongoDB
Selecione a aba Connection String ou MongoCredential abaixo para obter instruções e amostras de código para especificar este mecanismo de autenticação:
O exemplo a seguir autentica no GSSAPI usando uma string de conexão:
MongoClient mongoClient = MongoClients .create("<username>@<hostname>:<port>/?authSource=$external&authMechanism=GSSAPI");
Para especificar o mecanismo de autenticação GSSAPI usando a classe MongoCredential , chame o método createGSSAPICredential() , conforme mostrado no exemplo a seguir:
MongoCredential credential = MongoCredential.createGSSAPICredential("<username>"); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
Adquirir um ticket Kerberos
Para adquirir um ticket Kerberos, as bibliotecas GSSAPI Java exigem que você especifique o Realm e as propriedades do sistema JVM do Centro de Distribuição de Chaves (KDC). O exemplo a seguir mostra como definir estas propriedades:
java.security.krb5.realm=MYREALM.ME java.security.krb5.kdc=mykdc.myrealm.me
Definir propriedades adicionais
Talvez seja necessário especificar uma ou mais das seguintes propriedades adicionais do mecanismo de autenticação , dependendo da configuração do Kerberos:
SERVICE_NAMECANONICALIZE_HOST_NAMEJAVA_SUBJECTJAVA_SASL_CLIENT_PROPERTIESJAVA_SUBJECT_PROVIDER
Selecione a aba Connection String ou MongoCredential abaixo para obter instruções e amostras de código para especificar estas propriedades:
Para especificar as propriedades adicionais do GSSAPI, inclua a propriedade na string de conexão como um parâmetro de URL no formato <PROPERTY_NAME>:<value>.
O exemplo seguinte autentica para GSSAPI e especifica a propriedade SERVICE_NAME :
MongoClient mongoClient = MongoClients .create("<username>@<hostname>:<port>/?authSource=$external&authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:myService");
Importante
Você pode especificar as seguintes propriedades GSSAPI somente em uma instância MongoCredential :
JAVA_SUBJECTJAVA_SASL_CLIENT_PROPERTIESJAVA_SUBJECT_PROVIDER
Selecione a guia MongoCredential para saber como especificar estas propriedades.
Para especificar as propriedades adicionais do GSSAPI, chame o método withMechanismProperty() na sua instância do MongoCredential e passe o nome e o valor da propriedade como parâmetros. Use as constantes de nome da propriedade definidas na classe MongoCredential :
O exemplo seguinte autentica para GSSAPI e especifica a constante SERVICE_NAME_KEY:
MongoCredential credential = MongoCredential .createGSSAPICredential("<username>"); credential = credential .withMechanismProperty(MongoCredential.SERVICE_NAME_KEY, "<myService>");
A propriedade JAVA_SUBJECT_KEY exige um objeto javax.security.auth.Subject. Para recuperar um Subject, você deve primeiro autenticar através do Serviço de Autenticação e Autorização Java (JAAS) utilizando um LoginContext. O exemplo a seguir mostra esta configuração:
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);
Configurar cache de tickets
Por padrão, o driver Java Reactive Streams armazena em cache tíquetes Kerberos pela instância MongoClient que os criou. Se a sua implantação cria e destrói com frequência instâncias do MongoClient, você pode melhorar o desempenho alterando o comportamento padrão de cache de ticket Kerberos para cache por processo.
Importante
Você deve usar a classe MongoCredential para alterar o comportamento de cache padrão, pois o mecanismo de autenticação da string de conexão não é compatível com a propriedade do mecanismo JAVA_SUBJECT_PROVIDER.
Para armazenar em cache tickets Kerberos por processo, especifique a propriedade de mecanismo JAVA_SUBJECT_PROVIDER e forneça um KerberosSubjectProvider em sua instância MongoCredential, conforme mostrado no exemplo a seguir:
/* 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));
Observação
No Windows, o JRE da Oracle usa a Autoridade de Segurança Local (LSA) em vez da Interface do Provedor de Suporte de Segurança (SSPI) em sua implementação do GSSAPI. Isso limita a interoperabilidade com o Windows Active Directory e implementações de logon único. Para saber mais, consulte os seguintes recursos:
Informações adicionais
Para saber mais sobre autenticação no MongoDB, consulte Autenticação no manual do MongoDB Server .
Para saber mais sobre como criar um MongoClient objeto usando o driver Java Reactive Streams, consulte o guia Conectar ao MongoDB .
Documentação da API
Para saber mais sobre as aulas e os métodos mencionados neste guia, consulte a seguinte documentação da API: