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.
Puedes definir expresiones sencillas y estáticas 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>, ... }
Embedded Expressions
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
When you have more than one field in an expression, that expression evaluates to true if and only if every field in the expression evaluates to true. In other words, App Services treats multiple fields in a single expression as an "AND" operation.
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 evaluates expressions by first replacing expansions with their runtime values and then evaluating each field of the expanded expression document to a boolean expression. If all fields in an expression evaluate to true, the expression also evaluates to true. An empty expression ({}) evaluates to true.
Expression fields evaluate based on the following rules:
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, which represents a user interacting with your app.%%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 tu aplicación evalúa una expresión, reemplaza cada expansión en la expresión por un valor específico determinado por la configuración de la 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 utilizar Device Sync, las expansiones tienen restricciones especiales. Consulta Expansiones Compatibles con Sync.
Expansiones lógicas
Expansiones de valores
%%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.Each property of the object maps the name of an environment value to its value in the current environment.
{ "tag": "<Environment Name>" "values": { "<ValueName>": <Value> } } Ejemplo
La siguiente es una expresión de regla que evalúa en
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 ExpressionA list of all authentication provider identities associated with the user. An identity consists of a unique identifier given to a user by an authorization provider along with the provider's type:
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 modificado 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" } ] }
Service Expansions
%%args- Type:
objectUsable In: Third-Party ServicesUn documento que contiene los valores pasados como argumentos a una acción de servicio. Puedes acceder a cada argumento por su nombre de parámetro.
Ejemplo
The following is a Twilio service rule that evaluates to
trueif the sender's phone number (thefromargument) matches a specific value:{ "%%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
An expression operator represents an action or operation within an expression. Operators take in one or more arguments and evaluate to a result value. The type and value of the result depends on the operator you use and the arguments you pass to it.
Expression operators are denoted by strings that begin with either a single percent sign (%) or a dollar sign ($). You can use them in any expression.
Convert EJSON Values
Los siguientes operadores le permiten convertir valores entre representaciones EJSON y JSON:
%stringToOidConvierte una cadena de 12 o 24 bytes en un objeto EJSON
objectId.Ejemplo
{ "_id": { "%stringToOid": "%%user.id" } }
%oidToStringConvierte un objeto EJSON
objectIden una cadena.Ejemplo
{ "string_id": { "%oidToString": "%%root._id" } }
%stringToUuidConverts a 36-byte string to an EJSON
UUIDobject.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
The following operators allow you to call functions in your App Services application:
%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
The following operators allow you to determine if a value exists in an object or array:
$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:
$eqChecks if the field it is assigned to is equal to the specified value. Evaluates to a boolean representing the result.
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 } }
$gtVerifica si el campo al que se le asigna es estrictamente mayor que el valor especificado. Evalúa a un booleano que representa el resultado.
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 } }