Overview
Una expresión de regla es un objeto JSON que se escribe para controlar el acceso a datos con permisos. Cada expresión define las condiciones bajo las cuales un usuario puede realizar una acción. Por ejemplo, se puede escribir una expresión para controlar si un usuario puede leer o escribir datos en un documento de MongoDB o en un dominio sincronizado.
App Services evalúa una expresión de regla, generalmente con un documento como entrada, para obtener un resultado verdadero o falso.
Puede definir expresiones estáticas y simples que utilicen valores codificados:
{ "id": "aaaabbbbccccddddeeeeffff" }
También puede escribir expresiones que admitan lógica arbitraria para expresar requisitos dinámicos y flujos de trabajo complejos o personalizados. Una expresión dinámica puede incluir variables que reflejan el contexto actual, denominadas expansiones y pueden usar operadores integrados para transformar datos. El siguiente ejemplo se evalúa como verdadero si el documento de entrada... owner
El campo es igual al del usuario id y la dirección IP remota de la solicitud se puede encontrar en una matriz de direcciones IP permitidas que se almacena como un valor:
{ "owner": "%%user.id", "%%request.remoteIPAddress": { "$in": "%%values.allowedClientIPAddresses" } }
Restricciones
Al usar la sincronización de dispositivos, las expresiones tienen restricciones especiales. Consulte Expresiones compatibles con la sincronización.
Sintaxis de expresión
Una expresión es un valor booleano (es decir, true o false) o un objeto JSON.
Los nombres de campo de un objeto de expresión pueden ser un valor, una expansión o un operador. Cada campo debe contener un valor, una expansión o una expresión anidada.
Los objetos de expresión tienen el siguiente formato:
{ <Value | Expansion | Operator>: <Value | Expression>, ... }
Expresiones incrustadas
Puede incrustar varios documentos de expresión en los campos de otro documento de expresión para gestionar una lógica de evaluación compleja. App Services evalúa las expresiones en profundidad y en orden posterior: es decir, comienza en la parte inferior del árbol de expresiones y retrocede hasta los campos raíz, evaluando cada expresión después de todas sus expresiones incrustadas.
Ejemplo
Esta expresión se evalúa como true solo si el número proporcionado como argumento someNumber cae dentro de un rango específico.
{ "%%args.someNumber": { "%and": [ { "$gt": 0 }, { "$lte": 42 } ] } }
Expresiones multicampo
Cuando una expresión tiene más de un campo, esta se evalúa como true solo si todos sus campos se evalúan como verdaderos. En otras palabras, App Services trata varios campos de una misma expresión como una operación "AND".
Ejemplo
Esta expresión de regla de servicio de terceros se evalúa como true solo si url se proporcionó el argumento y el body.userId argumento coincide con el ID del usuario que llamó a la acción.
{ "%%args.url": { "$exists": true }, "%%args.body.userId": "%%user.id" }
Evaluación de expresiones
App Services evalúa las expresiones reemplazando primero las expansiones con sus valores de tiempo de ejecución y, a continuación, evaluando cada campo del documento de expresión expandida como una expresión booleana. Si todos los campos de una expresión se evalúan como true, la expresión también se evalúa como true. Una expresión vacía ({}) se evalúa como true.
Los campos de expresión se evalúan según las siguientes reglas:
Si un nombre de campo expandido coincide con su valor, se evalúa como
true.Si el valor de un campo es una expresión incrustada, su evaluación es la misma que la de dicha expresión.Consulte Expresiones incrustadas.
Nota
Si una regla no usa explícitamente la %%args expansión %%root o, los nombres de campo de expresión buscan argumentos o campos de documento con el mismo nombre de forma predeterminada. Por ejemplo, la expresión { "url": "https://www.example.com" } evalúa el valor de forma predeterminada con respecto a %%args.url en una regla de servicio y a %%root.url en una regla de MongoDB.
Expansiones
Una expansión es una variable que representa un valor dinámico en una expresión. Las expansiones se indican con dos signos de porcentaje seguidos del nombre de la expansión. Son:
%%root, que representa los datos en un documento MongoDB.%%user, que representa a un usuario que interactúa con su aplicación.%%request, que representa una solicitud entrante.%%values, que representa un valor estático.%%environment, que representa el entorno de su aplicación.%%args, que representa los argumentos que se pasaron a una acción de servicio.
Cuando su aplicación evalúa una expresión, reemplaza cada expansión en la expresión con un valor específico determinado por la configuración de su aplicación y el contexto en el momento de la evaluación.
Ejemplo
El siguiente ejemplo utiliza las expansiones %%user y %%root en una expresión "aplicar cuando":
"applyWhen": { "%%user.custom_data.status": "ACTIVE", "%%root.owners": "%%user.id" }
Nota
Algunas expansiones, como, están disponibles en todas las %%user %%root expresiones. Otras se limitan a contextos específicos, como, que no es compatible con Sync y solo está disponible en expresiones que operan en un documento.
Al usar la Sincronización de dispositivos, las expansiones tienen restricciones especiales.Consulta Expansiones compatibles con la sincronización.
Expansiones lógicas
Expansiones de valor
%%values- Type:
objectUsable In: Any ExpressionRepresenta los valores de la aplicación. Cada campo del objeto asigna un nombre de valor a su valor JSON o secreto correspondiente.
Ejemplo
La siguiente expresión se evalúa como
truesi el valoradmin_idses una lista que contiene el ID de la cuenta del usuario:{ "%%user.id": { "$in": "%%values.admin_ids" } }
Expansiones ambientales
%%environment- Type:
objectUsable In: Any ExpressionRepresenta el entorno de la aplicación actual. Puede leer el nombre del entorno
tag() y acceder a los valores del entorno.Cada propiedad del objeto asigna el nombre de un valor de entorno a su valor en el entorno actual.
{ "tag": "<Environment Name>" "values": { "<ValueName>": <Value> } } Ejemplo
La siguiente es una expresión de regla que evalúa como
truesi el entorno actual es"production"y el valor del entorno"baseUrl"está definido:{ "%%environment.tag": "production", "%%environment.values.baseUrl": { "%exists": true } }
Solicitar expansiones
%%request- Type:
objectUsable In: Any ExpressionRepresenta la solicitud entrante.
{ "httpMethod": "<HTTP Method>", "httpReferrer": "<HTTP Referer Header>", "httpUserAgent": "<HTTP User Agent>", "rawQueryString": "<URL Query String>", "remoteIPAddress": "<IP Address>", "requestHeaders": { "<Header Name>": ["<Header Value>", ...] }, "service": "<Service Name>", "action": "<Endpoint Function or Service Action Name>", "webhookUrl": "<HTTPS Endpoint Route>" }
Expansiones de usuario
%%user- Type:
objectUsable In: Any ExpressionRepresenta al usuario que inició la solicitud. El objeto de usuario contiene información de la cuenta, metadatos de los proveedores de autenticación y datos personalizados de la aplicación.
{ "id": "<User Account ID>", "type": "<normal | server>", "data": { "<Field Name>": <Value>, ... } "custom_data": { "<Field Name>": <Value>, ... } "identities": [ { "providerType": "<Auth Provider Name>", "id": "<Provider User ID" } ... ] } %%user.type- Type:
"normal" | "server"Usable In: Any ExpressionEl tipo de usuario que inició la solicitud. Se evalúa como
"server"para usuarios con clave API y como"normal"para todos los demás usuarios.
%%user.custom_data- Type:
objectUsable In: Any ExpressionLos datos personalizados del usuario. El contenido exacto varía según la configuración de datos de usuario personalizados.
Ejemplo
"custom_data": { "primaryLanguage": "English", }
%%user.data- Type:
objectUsable In: Any ExpressionLos metadatos del usuario. El contenido exacto variará según las identidades del proveedor de autenticación asociadas al usuario.
Ejemplo
"data": { "name": "Joe Mango", "email": "joe.mango@example.com" }
%%user.identities- Type:
object[]Usable In: Any ExpressionUna lista de todas las identidades de proveedores de autenticación asociadas al usuario. Una identidad consiste en un identificador único que un proveedor de autorización le otorga al usuario, junto con el tipo de proveedor:
Ejemplo
"identities": [ { "id": "5bce299457c70db9bd73b8-aajddbkuvomsvcrjjfoxs", "providerType": "local-userpass" } ]
Expansiones de documentos de MongoDB
%%this- Type:
anyUsable In: MongoDB Atlas Data SourcesEl valor de un campo particular tal como existe al final de una operación de base de datos.
%%prev- Type:
anyUsable In: MongoDB Atlas Data SourcesEl valor de un campo particular antes de que sea cambiado por una operación de escritura.
%%root- Type:
objectUsable In: MongoDB Atlas Data SourcesEl documento completo tal como existe al final de una operación de base de datos.
%%prevRoot- Type:
objectUsable In: MongoDB Atlas Data SourcesEl documento completo antes de que sea modificado por una operación de escritura.
Ejemplo
La siguiente es una expresión de validación de esquema MongoDB que evalúa como true si el documento existía previamente (es decir, la acción no es una inserción) o el campo status del documento tiene un valor de "new":
{ "%or": [ { "%%prevRoot": { "%exists": %%true } }, { "%%root.status": "new" } ] }
Expansiones de servicios
%%args- Type:
objectUsable In: Third-Party ServicesUn documento que contiene los valores pasados como argumentos a una acción de servicio. Se puede acceder a cada argumento por el nombre de su parámetro.
Ejemplo
La siguiente es una regla de servicio de Twilio que evalúa
truesi el número de teléfono del remitente (elfromargumento) coincide con un valor específico:{ "%%args.from": "+15558675309" }
%%partition- Type:
string | number | BSON.ObjectIdUsable In: Partion-based Sync(Solosincronización basada en particiones). El valor de la clave de partición de la partición actual que se está evaluando.
Operadores
Un operador de expresión representa una acción u operación dentro de una expresión. Los operadores toman uno o más argumentos y evalúan un valor de resultado. El tipo y el valor del resultado dependen del operador utilizado y de los argumentos que se le pasen.
Los operadores de expresión se representan mediante cadenas que comienzan con un solo signo de porcentaje (%) o un signo de dólar ($). Se pueden usar en cualquier expresión.
Convert EJSON Values
Los siguientes operadores le permiten convertir valores entre representaciones EJSON y JSON:
%stringToOidConvierte una cadena de 12bytes o 24bytes en un objeto EJSON
objectId.Ejemplo
{ "_id": { "%stringToOid": "%%user.id" } }
%oidToStringConvierte un objeto EJSON
objectIden una cadena.Ejemplo
{ "string_id": { "%oidToString": "%%root._id" } }
%stringToUuidConvierte una cadena de 36bytes en un objeto EJSON
UUID.Ejemplo
{ "_id": { "%stringToUuid": "%%user.id" } }
%uuidToStringConvierte un objeto EJSON
UUIDen una cadena.Ejemplo
{ "string_id": { "%uuidToString": "%%root._id" } }
Importante
Sin operaciones internas
%stringToUuid%uuidToString%stringToOid,, y no evalúan operadores JSON. Debe proporcionar una cadena literal/objeto EJSON o una expansión que evalúe a %oidToString uno.
Llamar a una función
Los siguientes operadores le permiten llamar funciones en su aplicación App Services:
%functionLlama a una función con el nombre y los argumentos especificados. Evalúa el valor que devuelve la función.
Ejemplo
{ "%%true": { "%function": { "name": "isEven", "arguments": [42] } } }
Comprobar existencia
Los siguientes operadores le permiten determinar si un valor existe en un objeto o matriz:
$existsComprueba si el campo al que está asignado tiene algún valor. Evalúa el resultado como un valor booleano.
Ejemplo
{ "url": { "$exists": true } }
Compare Values
Los siguientes operadores le permiten comparar valores, incluidos valores expandidos:
$eqComprueba si el campo al que está asignado es igual al valor especificado. Evalúa el resultado como un valor booleano.
Ejemplo
{ "score": { "$eq": 42 } }
$neComprueba si el campo al que está asignado no es igual al valor especificado. Evalúa el resultado como un valor booleano.
Ejemplo
{ "numPosts": { "$ne": 0 } }
$gtComprueba si el campo al que está asignado es estrictamente mayor que el valor especificado. Evalúa el resultado como un valor booleano.
Ejemplo
{ "score": { "$gt": 0 } }
$gteComprueba si el campo al que está asignado es mayor o igual que el valor especificado. Evalúa el resultado como un valor booleano.
Ejemplo
{ "score": { "$gte": 0 } }