Docs Menu
Docs Home
/ /
Definir permisos de acceso a datos

Permisos basados ​​en roles

Proteja los datos de su aplicación definiendo roles que se asignan automáticamente a las solicitudes entrantes de usuario y sesiones de sincronización. Cada rol tiene permisos de acceso a los datos detallados y condiciones dinámicas que determinan cuándo se aplica el rol.

Para obtener ejemplos de cómo puede configurar permisos para escenarios comunes con Device Sync, consulte la Guía de permisos de Device Sync.

Un permiso es un estado que Atlas App Services asigna a usuarios individuales para controlar lo que pueden y no pueden hacer con los datos de su aplicación. App Services utiliza permisos tanto a nivel de documento como de campo:

  • Los permisos a nivel de documento controlan si un usuario puede insertar, eliminar, modificar y buscar un documento específico en una colección de MongoDB.

  • Los permisos a nivel de campo controlan si un usuario puede leer o escribir datos en campos específicos de un documento.

Los permisos a nivel de documento de un rol determinan qué acciones se pueden realizar en todo el documento. Estos permisos siempre se aplican a todo el documento, independientemente del contenido. Un rol puede tener los siguientes permisos a nivel de documento:

  • Insertar: Puede insertar nuevos documentos.

  • Eliminar: puedes eliminar documentos existentes.

  • Buscar: Puede buscar el documento utilizando Atlas Search.

Los permisos para campos a nivel de rol determinan si un usuario puede leer o guardar campos dentro del documento. Estos permisos solo afectan al campo al que se aplican, por lo que un usuario puede tener acceso de lectura o guardado solo a un subconjunto del documento completo.

Puede definir permisos a nivel de campo para campos específicos y permisos de lectura/escritura predeterminados para cualquier campo adicional que no defina explícitamente.

El siguiente diagrama muestra cómo Servicios de aplicación determina si un usuario puede leer un documento dado:

Diagrama de flujo de permisos de lectura
haga clic para ampliar

El siguiente diagrama muestra cómo App Services determina si un usuario puede escribir un documento determinado:

Diagrama de flujo de permisos de escritura
haga clic para ampliar

Un rol es un conjunto de permisos nombrado que un usuario puede tener sobre documentos en una colección MongoDB. Un rol tiene una expresión de "aplicar cuando" que determina si App Services debe asignar el rol a un usuario. Los roles también tienen un conjunto de permisos a nivel de documentos y campos que un usuario tiene al ser asignado al rol.

App Services solo confirma las operaciones que un usuario está autorizado a realizar según su rol asignado. Si un rol no tiene permiso para leer un documento o algunos de sus campos, App Services omite el documento o los campos de los resultados.

Ejemplo

Consideremos una colección llamada employees Donde cada empleado tiene su propio documento con todos sus datos laborales. Esta colección puede tener dos roles: Empleado y Gerente. No utilizamos Sincronización de dispositivos, por lo que App Services selecciona un rol por documento.

  • Si un usuario solicita su propio documento, su rol es Empleado. Un empleado puede leer y guardar sus propios datos, pero no puede crear ni borrar sus propios documentos.

  • Si un usuario solicita un documento para alguien cuyo nombre aparece en los arreglos de manages del usuario, su rol es administrador. Un administrador puede leer y guardar los datos de sus reportes directos y puede crear y borrar sus documentos.

  • Si un usuario no es ni empleado ni gerente de un documento determinado, entonces no tiene ningún rol y no puede leer, escribir ni buscar ese documento.

{
"name": "Manager",
"apply_when": { "email": "%%user.custom_data.manages" },
"insert": true,
"delete": true,
"read": true,
"write": true,
"search": true,
"fields": {},
"additional_fields": {
"read": true,
"write": true
}
}
{
"name": "Employee",
"apply_when": { "email": "%%user.data.email" },
"insert": false,
"delete": false,
"read": true,
"write": true,
"search": true,
"fields": {},
"additional_fields": {
"read": true,
"write": true
}
}
{
"_id": ObjectId(...),
"employeeId": "0528",
"name": "Phylis Lapin",
"team": "sales",
"email": "phylis.lapin@dundermifflin.com",
"manages": []
}
{
"_id": ObjectId(...),
"employeeId": "0713",
"name": "Stanley Hudson",
"team": "sales",
"email": "stanley.hudson@dundermifflin.com",
"manages": []
}
{
"_id": ObjectId(...),
"employeeId": "0865",
"name": "Andy Bernard",
"team": "sales",
"email": "andy.bernard@dundermifflin.com",
"manages": [
"phylis.lapin@dundermifflin.com",
"stanley.hudson@dundermifflin.com"
]
}

App Services asigna roles en diferentes momentos dependiendo de si estás usando Sincronización de dispositivo (modo flexible) o no.

Al usar la Sincronización de Dispositivos, App Services asigna roles al inicio de una sesión de sincronización para cada colección que se sincronizará. Una sesión de sincronización es el periodo de tiempo entre la apertura y el cierre de una conexión de sincronización.

Cuando no se utiliza Device Sync, App Services asigna roles por documento y por solicitud.

Independientemente de si usa Device Sync, puede definir un conjunto de roles específicos para colecciones y roles predeterminados que se aplican a cualquier otra colección no especificada. Para asignar un rol, App Services evalúa la expresión "aplicar cuando" de cada rol en el orden especificado. El primer rol cuya expresión "aplicar cuando" se evalúe como verdadera se convierte en el rol asignado. Si no hay ningún rol coincidente, se deniega el acceso.

El conjunto de roles evaluados para una solicitud o sesión de sincronización dada depende de la colección a la que el usuario accede. Si definiste algún rol a nivel de colección para la colección, se evalúan los roles a nivel de colección. De lo contrario, se evalúan los roles predeterminados del origen de datos, si los hay.

App Services no recurre a los roles predeterminados si no se aplica ningún rol a nivel de colección. Si se define algún rol a nivel de colección, solo se evalúan los roles a nivel de colección. Los roles predeterminados se evalúan solo si no se definieron roles a nivel de colección.

Diagrama de flujo de asignación de roles
haga clic para ampliar

Cuando no se utiliza la Sincronización de dispositivos, App Services asigna roles dinámicamente a cada documento. Al usuario se le asigna un rol independiente, o ninguno, para cada documento que coincida con la consulta entrante.

Primero, su aplicación evalúa y aplica filtros y luego ejecuta la consulta.

Ejemplo

La siguiente solicitud hace que App Services evalúe un rol para cada documento en la colección restaurants donde el campo city está configurado en "Chicago":

db.restaurants.updateMany(
{ "city": "Chicago" },
{ "$set": { "city": "Chicago, IL" } }
);

Para cada documento devuelto por la consulta, la aplicación evalúa los posibles roles en orden y asigna el primer rol aplicable, si lo hay. Un rol se aplica a un documento determinado si suexpresión "aplicar cuando" se evalúa true como al ejecutarse en el documento.

Ejemplo

Un empleado siempre estará en su propio equipo, por lo que los roles de Empleado y Compañero de equipo se aplican a su propio documento. Sin embargo, solo puede usar un rol, por lo que preferimos usar Empleado porque es más específico.

Para configurar esto, especifique Empleado antes que Compañero de equipo en las definiciones de roles de la colección:

Definiciones de roles que especifican Gerente primero, Empleado segundo y Compañero de equipo tercero.
{
"database": "<Database Name>",
"collection": "<Collection Name>",
"roles": [
{ "name": "Manager", ... },
{ "name": "Employee", ... },
{ "name": "Teammate", ... }
]
}

Al usar la Sincronización de Dispositivos, App Services asigna roles al inicio de cada sesión de Sincronización Flexible para cada colección sincronizada. El rol determina qué permisos se aplican a cada colección durante la sesión.

App Services asigna como máximo un rol por colección. Si no se especificaron roles para una colección sincronizada, App Services usa los roles predeterminados. Si no se aplica ningún rol a una colección, el usuario no puede sincronizar (ni leer ni escribir) ninguna entrada en ella.

Un rol permanece asignado durante la sesión. Si algo relevante para el rol de un usuario cambia durante la sesión,no se le asigna un rol actualizado hasta que inicia una nueva sesión. Por ejemplo, si cambian los metadatos del usuario o la expresión "aplicar cuando" del rol, el usuario continúa usando el rol existente para esa colección hasta la próxima vez que inicia una sesión.

Existen algunas consideraciones especiales al usar Device Sync en relación con el sistema de permisos.Consulte Permisos compatibles con Device Sync.

Para obtener una guía sobre cómo configurar la sincronización flexible con modelos de permisos comunes, consulte la Guía de permisos de sincronización de dispositivos.

La expresión "aplicar cuando" de un rol es una expresión de regla que determina si el rol debe asignarse.

Puede usar variables de expresión para dinamizar los roles. Por ejemplo, puede usar la %%user expansión para referirse al usuario específico que emitió la solicitud. Esto le permite personalizar los permisos de acceso a los datos para cada usuario.

Cuando no utilice la Sincronización de dispositivos, puede consultar el documento actual al que se le está asignando un rol. Por ejemplo, puede usar. Esto le permite personalizar sus permisos de acceso a datos para cada %%root documento.

Las expresiones document_filters del rol determinan si se pueden evaluar los permisos subsiguientes a nivel de documento y campo. Esto es necesario para la sincronización de dispositivos.

Nota: App Services evalúa los filtros de documento individualmente. No deben confundirse con los filtros de consulta de nivel superior.

Los roles de una colección dada tienen una posición que determina el orden en que se evalúan y aplican. Cada rol se aplica cuando la expresión se evalúa en orden hasta que se aplica un rol o no quedan roles.

Un usuario solo puede tener un rol por documento en una consulta. El orden de roles determina cuál se aplica si las expresiones "aplicar cuando" de varios roles son verdaderas. Por lo tanto, al definir roles, priorice los más específicos.

Si la sincronización de dispositivos (modo flexible) está habilitada, el rol asignado debe ser compatible con la sincronización.Consulte Roles compatibles con la sincronización para obtener más información.

Puede configurar las reglas de acceso a datos de su aplicación desde la interfaz de usuario de App Services o implementando archivos de configuración con la CLI de App Services:

  1. Haga clic Rules En el menú de navegación izquierdo, seleccione una colección de la lista de colecciones de la fuente de datos. También puede seleccionar Default roles and filters para configurar reglas predeterminadas para todo el clúster.

    Si aún no hay roles definidos, se le pedirá que cree uno nuevo. De lo contrario, verá una lista ordenada de los roles existentes.

  2. Haga clic en Add role para definir un nuevo rol. Puede usar un rol predefinido como punto de partida o hacer clic en Skip (start from scratch).

  3. Asigne un nombre al rol. El nombre puede ser el que desee, pero debe ser único dentro de una colección determinada. Considere usar nombres que describan al usuario o su relación con los datos. Por ejemplo, Admin o Owner.

  4. Define una expresión "aplicar cuando" que determina cuándo un usuario determinado tiene el rol para un documento determinado.

  5. Definir permisos a nivel de documento para el rol.

  6. Define filtros de documentos para el rol. Esto es necesario para la sincronización de dispositivos (modo flexible).

  7. Utilice el menú desplegable para seleccionar los permisos a nivel de campo para el rol. Si Specify field-level permissions selecciona, introduzca los nombres de los campos para los que desea definir permisos.

    Para cada campo que nombre y para Additional Fields, especifique los permisos seleccionando None, Read o Read & Write.

  8. Guardar el rol.

  9. Si una colección tiene más de un rol asignado, puedes modificar el orden de los roles haciendo clic en las flechas de cada rol.

  1. Obtenga la última versión de su aplicación.

    appservices pull --remote="<Your App ID>"
  2. Define roles y filtros para una o más colecciones. También puedes definir roles y filtros predeterminados que se apliquen a cualquier colección sin configurar. Consulta Configuración de reglas para obtener más información.

    /data_sources/<data source>/<database><collection>/<colección>/rules.json
    {
    "database": "<Database Name>",
    "collection": "<Collection Name>",
    "roles": [
    {
    "name": "<Role Name>",
    "apply_when": {},
    "document_filters": {
    "read": { <Expression> },
    "write": { <Expression> }
    },
    "insert": true,
    "delete": true,
    "search": true,
    "fields": {
    "myField": { "read": true, "write": true }
    },
    "additional_fields": { "read": true, "write": true }
    }
    ],
    "filters": [
    {
    "name": "<Filter Name>",
    "apply_when": {},
    "query": {},
    "projection": {}
    }
    ]
    }
    /data_sources/<data source>/default_rule.json
    {
    "roles": [
    {
    "name": "<Role Name>",
    "apply_when": {},
    "document_filters": {
    "read": { <Expression> },
    "write": { <Expression> }
    },
    "insert": true,
    "delete": true,
    "search": true,
    "fields": {
    "myField": { "read": true, "write": true }
    },
    "additional_fields": { "read": true, "write": true }
    }
    ],
    "filters": [
    {
    "name": "<Filter Name>",
    "apply_when": {},
    "query": {},
    "projection": {}
    }
    ]
    }
  3. Implementa tu aplicación.

    appservices push

Nota

Consideraciones de seguridad para permisos basados ​​en roles de App Services

Si bien los permisos y filtros basados ​​en roles pueden ocultar documentos y campos específicos dentro de una colección, existe la posibilidad de que los datos queden expuestos si el sistema permite que consultas arbitrarias accedan a la colección.

Por ejemplo, las queries o funciones que provocan errores dependiendo de los valores almacenados en una colección (como los errores de división por cero) pueden revelar información sobre documentos, incluso si un rol o filtro impide que el usuario que realiza la query vea los documentos directamente. Los usuarios también pueden hacer inferencias sobre los datos subyacentes de otras maneras (como midiendo el tiempo de ejecución de la query, que puede verse afectado por la distribución de los datos).

Tenga en cuenta que esto es posible y audite sus patrones de acceso a datos cuando sea necesario.

Volver

Definir permisos de acceso a datos

En esta página