Overview
MongoDB Enterprise Edition incluye mecanismos de autenticación que no están disponibles en MongoDB Community Edition. En esta guía, aprenderá a autenticarse en MongoDB mediante estos mecanismos. Para obtener más información sobre otros mecanismos de autenticación disponibles en MongoDB, consulte Guía demecanismos de autenticación.
Especificar un mecanismo de autenticación
Puede especificar su mecanismo de autenticación y credenciales al conectarse a MongoDB utilizando cualquiera de las siguientes opciones:
Cadena de conexión
MongoCredentialmétodo de fábrica
Una cadena de conexión (también conocida como URI de conexión) especifica cómo conectarse y autenticarse en su clúster MongoDB.
Para autenticarse mediante una cadena de conexión, incluya su configuración en la cadena de conexión y, a continuación, pásela al método MongoClients.create() para crear una instancia de su MongoClient. Seleccione el Connection String
Pestaña en las siguientes secciones para ver la sintaxis para autenticar mediante una cadena de conexión.
También puede usar la clase MongoCredential para especificar sus datos de autenticación. La clase MongoCredential contiene métodos de fábrica estáticos que construyen instancias con su mecanismo de autenticación y credenciales. Al usar la clase auxiliar MongoCredential, utilice la clase MongoClientSettings.Builder para configurar sus ajustes de conexión. Seleccione la pestaña MongoCredential en las siguientes secciones para ver la sintaxis para la autenticación con MongoCredential.
Importante
El controlador Java Reactive Streams no es compatible ObjetosUnixServerAddress o conexiones de socket de dominio. Para usar un socket de dominio, utilice el controlador Java Sync. De lo contrario, utilice un objeto ServerAddress para conectarse desde el controlador Java Reactive Streams.
mecanismos
Kerberos (GSSAPI)
El mecanismo de autenticación de la API de servicios de seguridad genéricos (GSSAPI) le permite autenticarse en un servicio Kerberos mediante su nombre principal.
Las siguientes secciones contienen ejemplos de código que utilizan los siguientes marcadores de posición:
username: su nombre principal codificado en URL, como"username%40REALM.ME"hostname:dirección de red de su implementación de MongoDB a la que su cliente puede accederport: número de puerto de su implementación de MongoDB
Seleccione las pestañas Connection String o MongoCredential para ver la sintaxis correspondiente.
El siguiente ejemplo se autentica en GSSAPI mediante una cadena de conexión:
MongoClient mongoClient = MongoClients .create("<username>@<hostname>:<port>/?authSource=$external&authMechanism=GSSAPI");
Para especificar el mecanismo de autenticación GSSAPI utilizando la clase MongoCredential, llame al método createGSSAPICredential(), como se muestra en el siguiente ejemplo:
MongoCredential credential = MongoCredential.createGSSAPICredential("<username>"); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
Para adquirir un ticket Kerberos, las bibliotecas Java de GSSAPI requieren que se especifiquen las propiedades del sistema del dominio y del Centro de Distribución de Claves (KDC). Puede configurar estas opciones como se muestra en el siguiente ejemplo:
java.security.krb5.realm=MYREALM.ME java.security.krb5.kdc=mykdc.myrealm.me
Es posible que necesite especificar una o más de las siguientes propiedades de mecanismo MongoCredential adicionales, según su configuración de Kerberos:
SERVICE_NAMECANONICALIZE_HOST_NAMEJAVA_SUBJECTJAVA_SASL_CLIENT_PROPERTIESJAVA_SUBJECT_PROVIDER
Importante
Puede especificar las siguientes propiedades GSSAPI solo a través de la clase MongoCredential:
JAVA_SUBJECTJAVA_SASL_CLIENT_PROPERTIESJAVA_SUBJECT_PROVIDER
Seleccione la pestaña MongoCredential para saber cómo especificar estas propiedades.
Para especificar las propiedades adicionales de GSSAPI, incluya la propiedad en la cadena de conexión como un parámetro de URL en el formato: <PROPERTY_NAME>:<value>.
El siguiente ejemplo se autentica en GSSAPI y especifica propiedades adicionales:
MongoClient mongoClient = MongoClients .create("<username>@<hostname>:<port>/?authSource=$external&authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:myService");
Para especificar las propiedades adicionales de GSSAPI, llame al método withMechanismProperty() en su instancia MongoCredential y pase el nombre y el valor de la propiedad como parámetros. Utilice las constantes de nombre de propiedad definidas en la clase MongoCredential:
Seleccione la pestaña SERVICE_NAME_KEY o JAVA_SUBJECT_KEY para ver cómo especificar la propiedad correspondiente:
MongoCredential credential = MongoCredential .createGSSAPICredential("<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("<username>"); credential = credential .withMechanismProperty(MongoCredential.JAVA_SUBJECT_KEY, subject);
De forma predeterminada, el controlador Java Reactive Streams almacena en caché los tickets de Kerberos por instancia MongoClient. Si su implementación crea y destruye con frecuencia instancias MongoClient, puede cambiar el comportamiento predeterminado de almacenamiento en caché de tickets de Kerberos a caché por proceso para mejorar el rendimiento.
Para almacenar en caché los tickets Kerberos por proceso, debe usar el mecanismo de autenticación MongoCredential, ya que el mecanismo de autenticación de la cadena de conexión no admite la propiedad JAVA_SUBJECT_PROVIDER. Seleccione la pestaña MongoCredential para obtener información sobre cómo almacenar en caché los tickets Kerberos por proceso.
Para almacenar en caché los tickets Kerberos por proceso, especifique la JAVA_SUBJECT_PROVIDER propiedad del mecanismo y proporcione un KerberosSubjectProvider en su MongoCredential instancia, como se muestra en el siguiente ejemplo:
/* 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));
LDAP (PLAIN)
Puede autenticarse en un servidor de Protocolo ligero de acceso a directorios (LDAP) utilizando su nombre de usuario y contraseña del servidor de directorio.
Tip
El mecanismo de autenticación se denomina en PLAIN lugar de,LDAP ya que se autentica utilizando la capa de seguridad y autenticación simple (SASL) definida en RFC-.4616
Las siguientes secciones contienen ejemplos de código que utilizan los siguientes marcadores de posición:
ldap_username: su nombre de usuario LDAPldap_password: la contraseña de tu usuario LDAPhostname:dirección de red de su implementación de MongoDB a la que su cliente puede accederport: número de puerto de su implementación de MongoDB
Seleccione las pestañas Connection String o MongoCredential para ver la sintaxis correspondiente.
MongoClient mongoClient = MongoClients .create("<ldap_username>:<ldap_password>@<hostname>:<port>/?authSource=$external&authMechanism=PLAIN");
Para especificar el mecanismo de autenticación LDAP (PLAIN) utilizando la clase MongoCredential, llame al método createPlainCredential(), como se muestra en el siguiente ejemplo:
MongoCredential credential = MongoCredential .createPlainCredential(<ldap_username>, "$external", <ldap_password>); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
MONGODB-OIDC
Importante
El mecanismo de autenticación MONGODB-OIDC requiere MongoDB Server v7.0 o posterior ejecutándose en una plataforma Linux.
Las siguientes secciones describen cómo utilizar el mecanismo de autenticación MONGODB-OIDC para autenticarse en varias plataformas.
Para obtener más información sobre el mecanismo de autenticación MONGODB-OIDC, consulte Autenticación de OpenID Connect y Parámetros del servidor MongoDB en el manual del servidor MongoDB.
IMDS de Azure
Si su aplicación se ejecuta en una máquina virtual de Azure o utiliza el Servicio de metadatos de instancia de Azure (IMDS), puede autenticarse en MongoDB mediante la compatibilidad integrada de Azure del controlador Java Reactive Streams.
Puede especificar la autenticación OIDC de Azure IMDS mediante MongoCredential o como parte de la cadena de conexión.
Seleccione las pestañas Connection String o MongoCredential para ver la sintaxis correspondiente.
Reemplace el marcador <username> con el identificador de cliente o de aplicación de la identidad administrada de Azure o la aplicación empresarial. Reemplace el marcador <percent-encoded audience> en el siguiente código con el valor codificado porcentualmente del parámetro del servidor de audiencia configurado en su implementación de MongoDB.
El carácter de coma (,) y su codificación (%2C) están reservados. Su uso en un valor hace que el controlador interprete las comas como delimitadores de pares clave-valor. Debe especificar valores que contengan comas en una instancia MongoCredential, como se muestra en la pestaña MongoCredential.
MongoClient mongoClient = MongoClients.create( "mongodb://<username>@<hostname>:<port>/?" + "?authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:<percent-encoded audience>");
Reemplace el marcador <username> con el identificador de cliente o de aplicación de la identidad administrada de Azure o la aplicación empresarial. Reemplace el marcador <audience> con el valor del parámetro de servidor audience configurado en su implementación de MongoDB.
MongoCredential credential = MongoCredential.createOidcCredential("<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
Si su aplicación se ejecuta en una máquina virtual de Google Compute Engine o utiliza el servicio de metadatos de instancia de GCP, puede autenticarse en MongoDB mediante la compatibilidad con GCP integrada del controlador Java Reactive Streams.
Puede especificar la autenticación OIDC de GCP IMDS utilizando un MongoCredential o como parte de la cadena de conexión.
Las siguientes secciones contienen ejemplos de código que utilizan los siguientes marcadores de posición:
hostname:dirección de red de su implementación de MongoDB a la que su cliente puede accederport: número de puerto de su implementación de MongoDB
Seleccione las pestañas Connection String o MongoCredential para ver la sintaxis correspondiente.
Reemplace el marcador de posición <percent-encoded audience> en el siguiente código con el valor codificado en porcentaje del parámetro del servidor de audiencia configurado en su implementación de MongoDB.
El carácter de coma (,) y su codificación (%2C) están reservados. Su uso en un valor hace que el controlador interprete las comas como delimitadores de pares clave-valor. Debe especificar valores que contengan comas en una instancia MongoCredential, como se muestra en la pestaña MongoCredential.
MongoClient mongoClient = MongoClients.create( "mongodb://<hostname>:<port>/?" + "authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:<percent-encoded audience>");
Reemplace el marcador de posición <audience> con el valor del parámetro de servidor audience configurado en su implementación de 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());
Kubernetes
Si tu aplicación se ejecuta en un clúster de Kubernetes, puedes autenticarte en MongoDB usando el soporte integrado para Kubernetes del driver de Streams reactivos de Java.
Seleccione una de las pestañas Connection String o MongoCredential para ver la sintaxis correspondiente.
Para especificar Kubernetes OIDC como mecanismo de autenticación, configure las siguientes opciones en su cadena de conexión:
authMechanism:Establecer enMONGODB-OIDC.authMechanismProperties:Establecer enENVIRONMENT:k8s.
MongoClient mongoClient = MongoClients.create( "mongodb://<hostname>:<port>/" + "?authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:k8s");
Reemplace hostname y port con la dirección de red y el número de puerto de su implementación de MongoDB.
MongoCredential credential = MongoCredential.createOidcCredential(null) .withMechanismProperty("ENVIRONMENT", "k8s"); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
Devolución de llamada personalizada
El controlador Java Reactive Streams no ofrece compatibilidad integrada con todas las plataformas, incluidas Azure Functions y Azure Kubernetes Service (AKS). En su lugar, debe definir una devolución de llamada personalizada para usar OIDC para la autenticación desde estas plataformas. Para ello, utilice la propiedad de autenticación "OIDC_CALLBACK", como se muestra en el siguiente ejemplo de código:
MongoCredential credential = MongoCredential.createOidcCredential(null) .withMechanismProperty("OIDC_CALLBACK", (context) -> { String accessToken = ... return new OidcCallbackResult(accessToken); });
El valor de la propiedad "OIDC_CALLBACK" debe ser una lambda u otra implementación de la interfaz funcional OidcCallback que acepte un OidcCallbackContext como parámetro y devuelva un OidcCallbackResult.
El siguiente ejemplo utiliza una devolución de llamada de ejemplo para recuperar un token OIDC de un archivo llamado "access-token.dat" en el sistema de archivos 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());