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 mecanismo de autenticación guide.
Especificar un mecanismo de autenticación
Puedes especificar tu mecanismo de autenticación y credenciales al conectarte a MongoDB utilizando una 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 tu clúster de MongoDB.
Para autenticar utilizando una cadena de conexión, incluye tus ajustes en tu cadena de conexión y luego pásala al método MongoClients.create() para crear tu MongoClient. Elija el Connection String
pestaña en las siguientes secciones para ver la sintaxis para autenticar usando 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 UnixServerAddress objetos o conexiones de sockets de dominio. Para utilizar un socket de dominio para conectar, utiliza el Java Sync driver. De lo contrario, utiliza un objeto ServerAddress para conectar 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 usan los siguientes marcadores de posición:
username: su nombre principal codificado en URL, como"username%40REALM.ME"hostnamela dirección de red de tu implementación de MongoDB a la que tu cliente puede accederportnú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 con GSSAPI utilizando 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 tengas que especificar una o más de las siguientes propiedades adicionales del mecanismo MongoCredential, según la 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, llama al método withMechanismProperty() en tu instancia MongoCredential y pasa el nombre de la propiedad y el valor como parámetros. Utilizar las constantes de nombres de propiedades 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);
Por defecto, el controlador Java Reactive Streams almacena en caché los tickets de Kerberos por instancia de MongoClient. Si tu implementación crea y destruye frecuentemente instancias MongoClient, puedes cambiar el comportamiento de almacenamiento en caché por defecto de los tickets de Kerberos a almacenamiento 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 llama PLAIN en lugar de LDAP ya que autentica usando la Capa de Autenticación y Seguridad Simple PLAIN (SASL) definida en RFC-4616.
Las siguientes secciones contienen ejemplos de código que usan los siguientes marcadores de posición:
ldap_username: su nombre de usuario LDAPldap_password: la contraseña de tu usuario LDAPhostnamela dirección de red de tu implementación de MongoDB a la que tu cliente puede accederportnú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) mediante el uso de la clase MongoCredential, llama 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 funcionando 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, consulta Autenticación de OpenID Connect y Parámetros del MongoDB Server en el manual del MongoDB Server.
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 utilizando un MongoCredential o como parte de la cadena de conexión.
Seleccione las pestañas Connection String o MongoCredential para ver la sintaxis correspondiente.
Sustituya el marcador de posición <username> por el ID de cliente o el ID de la aplicación de la identidad gestionada de Azure o de la aplicación empresarial. Reemplace el marcador de posición <percent-encoded audience> en el siguiente código con el valor codificado en porcentaje del parámetro de 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>");
Sustituya el marcador de posición <username> por el ID de cliente o el ID de la aplicación de la identidad gestionada de Azure o de la aplicación empresarial. 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("<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 tu aplicación se ejecuta en una VM de Google Compute Engine o utiliza de alguna manera el Servicio de metadatos de instancias de GCP, puedes autenticarte a MongoDB usando la funcionalidad incorporada para GCP del driver de flujos reactivos de Java.
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 usan los siguientes marcadores de posición:
hostnamela dirección de red de tu implementación de MongoDB a la que tu cliente puede accederportnúmero de puerto de su implementación de MongoDB
Seleccione las pestañas Connection String o MongoCredential para ver la sintaxis correspondiente.
Reemplaza 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 tu 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>");
Suplanta el marcador de posición <audience> con el valor del parámetro del servidor audience configurado en tu 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.
Selecciona entre las pestañas Connection String o MongoCredential para ver la sintaxis correspondiente.
Para especificar Kubernetes OIDC como el mecanismo de autenticación, establezca 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 los 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());
Función de retorno personalizado
El controlador de Java Reactive Streams no ofrece soporte incorporado para todas las plataformas, incluidas Azure Functions y Azure Kubernetes Service (AKS). En su lugar, debe definir una función de retorno personalizada para utilizar OIDC para autenticar desde estas plataformas. Para ello, utiliza 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());