Visão geral
Neste guia, você aprenderá como autenticar com o MongoDB usando cada mecanismo de autenticação disponível exclusivamente no MongoDB Enterprise Edition.
Você pode usar os seguintes mecanismos com a versão mais recente do MongoDB Enterprise Edition:
Para autenticar usando outro mecanismo, consulte o guia Mecanismos de autenticação. Para saber mais sobre como estabelecer uma conexão com seu cluster MongoDB, consulte o guia Conectar ao MongoDB.
Especificar um mecanismo de autenticação
Você pode especificar seu mecanismo de autenticação e credenciais ao se conectar ao MongoDB usando um dos seguintes:
Uma connection string
Um método de fábrica do
MongoCredential
Uma connection string (também conhecida como uri de conexão) especifica como se conectar e autenticar ao cluster MongoDB.
Para autenticar usando uma cadeia de conexão, inclua suas configurações na cadeia de conexão e passe-a para o método MongoClients.create() para instanciar seu MongoClient. Selecione a aba Connection String para visualizar a sintaxe para autenticar utilizando uma cadeia de conexão.
Alternativamente, você pode utilizar a classe MongoCredential para especificar seus detalhes de autenticação. A classe MongoCredential contém métodos de fábrica estáticos que constroem instâncias contendo seu mecanismo de autenticação e credenciais. Quando você usa a classe auxiliar MongoCredential, é necessário usar a classe MongoClientSettings.Builder para definir as configurações de conexão ao construir o MongoClient. Selecione a aba MongoCredential para visualizar a sintaxe para autenticar utilizando um MongoCredential.
Para obter mais informações sobre essas classes e métodos, consulte a seguinte documentação da API:
Mecanismos
Kerberos (GSSAPI)
O mecanismo de autenticação da API de Serviços de Segurança Genérica (GSSAPI) permite ao usuário se autenticar em um serviço Kerberos usando o nome principal do usuário.
Observação
O método refere-se ao mecanismo de autenticação GSSAPI em vez de Kerberos porque o driver autentica usando o mecanismo GSSAPI RFC-4652 SASL.
Os seguintes trechos de código mostram como especificar o mecanismo de autenticação, usando os seguintes placeholders:
principal_username: seu nome principal codificado para URL, como"username%40REALM.ME"hostname: endereço de rede da sua MongoDB deployment que seu cliente pode acessarport: 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:
Para especificar o mecanismo de autenticação GSSAPI usando uma cadeia de conexão:
Atribuir o parâmetro de URL
authMechanismao valorGSSAPI(opcional) Atribua o parâmetro de URL do
authSourceao valor$external
Observação
Se você especificar o mecanismo GSSAPI , não poderá atribuir authSource a nenhum valor diferente de $external.
O código para instanciar um MongoClient é semelhante ao seguinte:
MongoClient mongoClient = MongoClients.create("<principal_username>@<hostname>:<port>/?authSource=$external&authMechanism=GSSAPI");
Para especificar o mecanismo de autenticação GSSAPI utilizando a classe MongoCredential , utilize o método createGSSAPICredential() . O código para instanciar um MongoClient se assemelha ao seguinte:
MongoCredential credential = MongoCredential.createGSSAPICredential(<principal_username>); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
Para adquirir um ticket Kerberos, as bibliotecas GSSAPI Java exigem que você especifique as propriedades do sistema Realm e Key Distribution Center (KDC). Consulte as configurações de amostra no exemplo a seguir:
java.security.krb5.realm=MYREALM.ME java.security.krb5.kdc=mykdc.myrealm.me
Talvez seja necessário especificar uma ou mais das seguintes propriedades adicionais do mecanismo MongoCredential , dependendo da configuração do Kerberos:
SERVICE_NAMECANONICALIZE_HOST_NAMEJAVA_SUBJECTJAVA_SASL_CLIENT_PROPERTIESJAVA_SUBJECT_PROVIDER
Importante
Você só pode especificar as seguintes propriedades GSSAPI utilizando o MongoCredential:
JAVA_SUBJECTJAVA_SASL_CLIENT_PROPERTIESJAVA_SUBJECT_PROVIDER
Selecione a guia MongoCredential para ver como especificá-los.
Para especificar uma das propriedades adicionais da GSSAPI, inclua-a na string de conexão como um parâmetro de URL usando o formato: <PROPERTY_NAME>:<value>.
Seu código para instanciar um MongoClient utilizando GSSAPI e propriedades adicionais pode se assemelhar ao seguinte:
MongoClient mongoClient = MongoClients.create("<principal_username>@<hostname>:<port>/?authSource=$external&authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:myService");
Para especificar uma das propriedades adicionais da 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 :
Selecione a abaSERVIÇO_NAME_KEY ou JAVA_SUBJECT_KEY para ver o código de exemplo para instanciar um MongoCredential que usa GSSAPI e a propriedade selecionada:
MongoCredential credential = MongoCredential.createGSSAPICredential(<principal_username>); credential = credential.withMechanismProperty(MongoCredential.SERVICE_NAME_KEY, "myService");
LoginContext loginContext = new LoginContext(<LoginModule implementation from JAAS config>); loginContext.login(); Subject subject = loginContext.getSubject(); MongoCredential credential = MongoCredential.createGSSAPICredential(<principal_username>); credential = credential.withMechanismProperty(MongoCredential.JAVA_SUBJECT_KEY, subject);
Por padrão, o driver Java armazena em cache tickets Kerberos por instância MongoClient . Se o seu sistema precisar criar e destruir instâncias MongoClient com frequência, você poderá alterar o comportamento padrão de cache de tíquetes do Kerberos para cache por processo para melhorar o desempenho.
Para armazenar tickets Kerberos em cache por processo, você deve usar o mecanismo de autenticação MongoCredential, pois o mecanismo de autenticação de string de conexão não oferece suporte à propriedade de mecanismo JAVA_SUBJECT_PROVIDER. Se você quiser armazenar tíquetes Kerberos em cache por processo, selecione a guia MongoCredential para saber como fazer isso.
Para armazenar em cache tickets Kerberos por processo, você deve especificar a propriedade de mecanismo JAVA_SUBJECT_PROVIDER e fornecer um KerberosSubjectProvider em sua instância MongoCredential. O código para configurar o driver Java para armazenar em cache os tickets Kerberos por processo é semelhante ao seguinte:
/* all MongoClient instances sharing this instance of KerberosSubjectProvider will share a Kerberos ticket cache */ String myLoginContext = "myContext"; MongoCredential credential = MongoCredential.createGSSAPICredential(<principal_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));
LDAP (simples)
Disponível no MongoDB Enterprise Edition 3.4 e posterior.
Você pode autenticar em um servidor LDAP (Lightweight Directory Access Protocol) usando seu nome de usuário e senha do servidor de diretórios.
Dica
O mecanismo de autenticação é nomeado em PLAIN vez de,LDAP pois autentica usando a PLAIN Simple Authentication and Security Layer (SASL) definida em RFC-4616.
Você pode especificar este mecanismo de autenticação configurando o parâmetro authMechanism para PLAIN e incluindo seu nome de usuário e senha LDAP na connection string.
Os seguintes trechos de código mostram como especificar o mecanismo de autenticação, usando os seguintes placeholders:
username: seu nome de usuário LDAPpassword: a senha do usuário LDAPhostname: endereço de rede da sua MongoDB deployment que seu cliente pode acessarport: 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:
Para especificar o mecanismo de autenticação LDAP (PLAIN) usando uma cadeia de conexão:
Atribuir o parâmetro de URL
authMechanismao valorPLAIN(opcional) Atribua o parâmetro de URL do
authSourceao valor$external
Observação
Se você especificar o mecanismo PLAIN , não poderá atribuir authSource a nenhum valor diferente de $external.
O código para instanciar um MongoClient é semelhante ao seguinte:
MongoClient mongoClient = MongoClients.create("<username>:<password>@<hostname>:<port>/?authSource=$external&authMechanism=PLAIN");
Para especificar o mecanismo de autenticação LDAP (PLAIN) usando a classe MongoCredential , use o método createPlainCredential() . O código para instanciar um MongoClient se assemelha ao seguinte:
MongoCredential credential = MongoCredential.createPlainCredential(<username>, "$external", <db_password>); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
MONGODB-OIDC
Importante
O mecanismo de autenticação MONGODB-OIDC requer MongoDB Server v7.0 ou posterior em execução em uma plataforma Linux.
As seções a seguir descrevem como usar o mecanismo de autenticação MONGODB-OIDC para autenticar em várias plataformas.
Para obter mais informações sobre o mecanismo de autenticação MONGODB-OIDC, consulte Autenticação do OpenID Connect e MongoDB Server do MongoDB Server no manual do Servidor MongoDB.
IMDS do Azure
Se o seu aplicação for executado em uma VM do Azure ou de outra forma usar o Azure Instance Metadata Service (IMDS), você poderá autenticar no MongoDB usando o suporte integrado do Azure driver Java .
Você pode especificar a autenticação do Azure IMDS OIDC utilizando um MongoCredential ou como parte da string de conexão.
Selecione nas abas Connection String ou MongoCredential para ver a sintaxe correspondente.
Substitua o espaço reservado <percent-encoded audience> no seguinte código pelo valor codificado por porcentagem do parâmetro do servidor de público configurado em sua implantação do MongoDB .
O caractere de vírgula (,) e sua codificação (%2C) são reservados, e o uso desses caracteres em um valor faz com que o driver interprete as vírgulas como delimitadores de pares de valores-chave. Você deve especificar valores que contêm vírgulas em uma instância do MongoCredential , como demonstrado na aba MongoCredential .
MongoClient mongoClient = MongoClients.create( "mongodb://<db_username>@<hostname>:<port>/?" + "?authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:<percent-encoded audience>");
Substitua o espaço reservado <db_username> pelo ID do cliente ou ID do aplicativo da identidade gerenciada pelo Azure ou do aplicação corporativo. Substitua o espaço reservado <audience> pelo valor do parâmetro de servidor audience configurado em sua implantação do MongoDB .
MongoCredential credential = MongoCredential.createOidcCredential("<db_username>") .withMechanismProperty("ENVIRONMENT", "azure") .withMechanismProperty("TOKEN_RESOURCE", "<audience>"); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
GCP IMDS
Se seu aplicação é executado em uma VM do Google Compute Engine ou usa o GCP Instance Metadata Service, você pode autenticar no MongoDB usando o suporte integrado ao GCP do driver Java .
Você pode especificar a autenticação GCP IMDS OIDC usando um MongoCredential ou como parte da string de conexão.
Selecione nas abas Connection String ou MongoCredential para ver a sintaxe correspondente.
Substitua o espaço reservado <percent-encoded audience> no seguinte código pelo valor codificado por porcentagem do parâmetro do servidor de público configurado em sua implantação do MongoDB .
O caractere de vírgula (,) e sua codificação (%2C) são reservados, e o uso desses caracteres em um valor faz com que o driver interprete as vírgulas como delimitadores de pares de valores-chave. Você deve especificar valores que contêm vírgulas em uma instância do MongoCredential , como demonstrado na aba MongoCredential .
MongoClient mongoClient = MongoClients.create( "mongodb://<hostname>:<port>/?" + "authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:<percent-encoded audience>");
Substitua o espaço reservado <audience> pelo valor do parâmetro de servidor audience configurado em sua implantação do MongoDB .
MongoCredential credential = MongoCredential.createOidcCredential() .withMechanismProperty("ENVIRONMENT", "gcp") .withMechanismProperty("TOKEN_RESOURCE", "<audience>"); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
Chamada de resposta personalizada
O driver Java não oferece suporte integrado para todas as plataformas, incluindo Azure Functions e Azure Kubernetes Service (AKS). Em vez disso, você deve definir um retorno de chamada personalizado para usar o OIDC para autenticar a partir dessas plataformas. Para fazer isso, use a propriedade de autenticação "OIDC_CALLBACK" , como mostrado no seguinte exemplo de código:
MongoCredential credential = MongoCredential.createOidcCredential(null) .withMechanismProperty("OIDC_CALLBACK", (context) -> { String accessToken = ... return new OidcCallbackResult(accessToken); });
O valor da propriedade "OIDC_CALLBACK" deve ser um Lambda ou outra implementação da interface funcional OidcCallback que aceite um OidcCallbackContext como parâmetro e retorne um OidcCallbackResult.
O exemplo a seguir usa um exemplo de chamada de resposta para recuperar um token OIDC de um arquivo chamado "access-token.dat" no sistema de arquivos local:
MongoCredential credential = MongoCredential.createOidcCredential(null) .withMechanismProperty("OIDC_CALLBACK", (context) -> { string accessToken = new String(Files.readAllBytes(Paths.get("access-token.dat")); return new OidcCallbackResult(accessToken); }); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());