Overview
ルール式は、権限を持つデータアクセスを制御するためにユーザーが記述する JSON オブジェクトです。 各式は、ユーザーがアクションを実行できる条件を定義します。 たとえば、式を記述して、MongoDB ドキュメントまたは同期された Realm におけるユーザーによるデータの読み取りや書込みを制御できます。
App Services は、true または false の結果を得るために、通常はドキュメントを入力としてルール式を評価します。
ハードコードされた値を使用する単純で静的な式を定義できます。
{ "id": "aaaabbbbccccddddeeeeffff" }
また、動的要件や複雑なワークフロー、カスタム ワークフローを表現するために、任意のロジックをサポートする式を書込むこともできます。動的式には、現在のコンテキストを反映する変数を含めることができます( 展開 と呼ばれ、組み込み演算子を使用してデータを変換できます。次の例では、入力ドキュメントのowner
フィールドがユーザーのid
と等しく、かつリクエストのリモートIPアドレスが 値として保存されている許可されたIPアドレスの配列で見つかる場合、true と評価します。
{ "owner": "%%user.id", "%%request.remoteIPAddress": { "$in": "%%values.allowedClientIPAddresses" } }
制限事項
Device Sync を使用する場合、 式には特別な制限があります。 「同期互換式 」を参照してください。
式の構文
式はブール値( true
またはfalse
)、または JSON オブジェクト
式オブジェクト フィールド名は、値、展開、または演算子にすることができます。 各フィールドには、値、展開、またはネストされた式のいずれかが含まれている必要があります。
式オブジェクトの形式は次のとおりです。
{ <Value | Expansion | Operator>: <Value | Expression>, ... }
埋め込み式
複雑な評価ロジックを処理するために、複数の式ドキュメントを別の式ドキュメントのフィールドに埋め込むことができます。 App Services は深度が最初に、 後の順序 で式を評価します。つまり、式ツリーの最下位から始まり、埋め込まれた式のすべての後に各式を評価することで、ルートレベルのフィールドに戻ります。
例
この式は、 someNumber
引数として指定された数値が特定の範囲にある場合にのみ、 true
と評価されます。
{ "%%args.someNumber": { "%and": [ { "$gt": 0 }, { "$lte": 42 } ] } }
マルチフィールド式
式に複数のフィールドがある場合、その式は 式内のすべてのフィールドが true と評価された場合にのみtrue
と評価されます。 つまり、App Services は 1 つの式内の複数のフィールドを "AND" 操作として扱います。
例
このサードパーティ サービス ルール式は、 url
引数が指定され、かつbody.userId
引数がアクションを呼び出したユーザーの ID と一致する場合にのみtrue
と評価されます。
{ "%%args.url": { "$exists": true }, "%%args.body.userId": "%%user.id" }
式評価
App Services は、まず展開をそのランタイム値で置き換え、次に展開された式ドキュメントの各フィールドをブール値に評価することで式を評価します。 式内のすべてのフィールドがtrue
と評価される場合、式もtrue
と評価されます。 空の式( {}
)はtrue
と評価されます。
式フィールドは、次のルールに基づいて評価されます。
展開されたフィールド名がその値と一致する場合、
true
と評価されます。フィールドの値が埋め込み式の場合、埋め込み式と同じ値として評価されます。 「埋め込み式 」を参照してください。
拡張機能
展開は、式で動的な値を表す変数です。 展開は、2% 記号とそれに続く展開名で表されます。 これらは次のとおりです。
%%root
は、MongoDB ドキュメント内のデータを表します。%%user
は、アプリを操作するユーザーを表します。%%request
は、受信リクエストを表します。%%values
は、静的値を表します。%%environment
は、アプリの環境を表します。%%args
は、サービス アクションに渡された引数を表します。
アプリが式を評価する際、式内の各展開を、評価時にアプリの構成とコンテキストによって決定される特定の値に置き換えます。
例
次の例では、"apply when" 式で%%user
と%%root
の展開を使用します。
"applyWhen": { "%%user.custom_data.status": "ACTIVE", "%%root.owners": "%%user.id" }
注意
%%user
などの一部の展開は、すべての式で使用できます。 他の は、同期互換性がなく、ドキュメントを操作する式でのみ使用できる%%root
など、特定のコンテキストに限定されます。
Device Sync を使用する場合、展開には特別な制限があります。 「同期互換拡張機能 」を参照してください。
論理展開
値の拡張
%%values
- Type:
object
Usable In: Any Expressionアプリケーションの値 を表します。 オブジェクトの各フィールドは、値名を対応する JSON 値またはシークレットにマッピングします。
例
次の式は、値
admin_ids
がユーザーのアカウント ID を含むリストである場合、true
と評価されます。{ "%%user.id": { "$in": "%%values.admin_ids" } }
環境の拡張
%%environment
- Type:
object
Usable In: Any Expression現在のアプリ環境を表します。 環境名(
tag
)を読み取って、環境値にアクセスできます。オブジェクトの各プロパティは、環境値の名前を現在の環境内の値にマッピングします。
{ "tag": "<Environment Name>" "values": { "<ValueName>": <Value> } } 例
以下は、現在の環境が
"production"
で、"baseUrl"
環境値が定義されている場合にtrue
と評価されるルール式です。{ "%%environment.tag": "production", "%%environment.values.baseUrl": { "%exists": true } }
リクエストの展開
%%request
- Type:
object
Usable In: Any Expression{ "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>" }
ユーザーの拡張
%%user
- Type:
object
Usable In: Any Expressionリクエストを開始したユーザーを表します。 ユーザー オブジェクトには、アカウント情報、認証プロバイダからのメタデータ、アプリのカスタム データが含まれています。
{ "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 Expressionリクエストを開始したユーザーのタイプ。 API キーユーザーでは
"server"
と評価され、他のすべてのユーザーでは"normal"
と評価されます。
%%user.custom_data
- Type:
object
Usable In: Any Expressionユーザーのカスタム データ。 具体的な内容は、カスタムユーザーデータ構成によって異なります。
例
"custom_data": { "primaryLanguage": "English", }
%%user.data
- Type:
object
Usable In: Any Expressionユーザーのメタデータ。 具体的な内容は、ユーザーに関連付けられた認証プロバイダの ID によって異なります。
例
"data": { "name": "Joe Mango", "email": "joe.mango@example.com" }
%%user.identities
- Type:
object[]
Usable In: Any Expressionユーザーに関連付けられているすべての認証プロバイダID のリスト。 ID は、認可プロバイダーによってユーザーに付与される一意の識別子と、プロバイダーのタイプで構成されます。
例
"identities": [ { "id": "5bce299457c70db9bd73b8-aajddbkuvomsvcrjjfoxs", "providerType": "local-userpass" } ]
MongoDB ドキュメントの拡張
%%this
- Type:
any
Usable In: MongoDB Atlas Data Sourcesデータベース操作の最後に存在する特定のフィールドの値。
%%prev
- Type:
any
Usable In: MongoDB Atlas Data Sources書込み操作によって変更される前の特定のフィールドの値。
%%root
- Type:
object
Usable In: MongoDB Atlas Data Sourcesデータベース操作の最後に存在する完全なドキュメント。
%%prevRoot
- Type:
object
Usable In: MongoDB Atlas Data Sources書込み操作によって変更される前の完全なドキュメント。
例
以下は、ドキュメントが以前に存在していた(アクションが挿入ではない)か、ドキュメントのstatus
フィールドの値が"new"
の場合にtrue
と評価される MongoDB スキーマ検証式です。
{ "%or": [ { "%%prevRoot": { "%exists": %%true } }, { "%%root.status": "new" } ] }
サービスの拡張
%%args
- Type:
object
Usable In: Third-Party Services [Deprecated]サービス アクションに引数として渡される値を含むドキュメント。 各引数には、パラメーター名でアクセスできます。
例
以下は、送信元の電話番号(
from
引数)が特定の値と一致する場合にtrue
と評価されるTwilio のサービスルールです。{ "%%args.from": "+15558675309" }
%%partition
- Type:
string | number | BSON.ObjectId
Usable In: Partion-based Sync(パーティションベースの同期のみ) 現在評価されているパーティションのパーティションキー値。
演算子
式演算子は、式内のアクションまたは操作を表します。 演算子は 1 つ以上の引数を受け取り、結果値として評価されます。 結果の型と値は、使用する演算子とその結果に渡す引数によって異なります。
式演算子は、単一のパーセント記号( %
)またはドル記号( $
)で始まる string によって表されます。 これらは任意の式で使用できます。
Convert EJSON Values
次の演算子を使用すると、EJSON と JSON 表現の間で値を変換できます。
%stringToOid
12 バイトまたは 24 バイトの string を EJSON
objectId
オブジェクトに変換します。例
{ "_id": { "%stringToOid": "%%user.id" } }
重要
内部操作なし
%stringToUuid
、 %uuidToString
、 %stringToOid
、 %oidToString
は JSON 演算子を評価しません。 リテラル string/EJSON オブジェクトまたはいずれかに評価される展開を指定する必要があります。
関数の呼び出し
次の演算子を使用すると、Atlas App Services アプリケーションで関数を呼び出すことができます。
%function
指定された名前と引数を持つ関数を呼び出します。 関数が返す値を評価します。
例
{ "%%true": { "%function": { "name": "isEven", "arguments": [42] } } }
有無を確認
次の演算子を使用すると、値がオブジェクトまたは配列に存在するかどうかを判断できます。
Compare Values
次の演算子を使用すると、展開された値を含む値を比較できます。