Docs Menu
Docs Home
/ /
Atlas App Services
/

ルール式

ルール式は、権限を持つデータアクセスを制御するためにユーザーが記述する JSON オブジェクトです。 各式は、ユーザーがアクションを実行できる条件を定義します。 たとえば、式を記述して、MongoDB ドキュメントまたは同期された Realm におけるユーザーによるデータの読み取りや書込みを制御できます。

App Services は、true または false の結果を得るために、通常はドキュメントを入力としてルール式を評価します。

ハードコードされた値を使用する単純で静的な式を定義できます。

入力ドキュメントの " ID " フィールドが指定されたハードコードされたID "aaaaggers atlas doubledeleteff" と一致する場合にのみ true と評価される "静的" 式
{ "id": "aaaabbbbccccddddeeeeffff" }

また、動的要件や複雑なワークフロー、カスタム ワークフローを表現するために、任意のロジックをサポートする式を書込むこともできます。動的式には、現在のコンテキストを反映する変数を含めることができます( 展開 と呼ばれ、組み込み演算子を使用してデータを変換できます。次の例では、入力ドキュメントのowner フィールドがユーザーのid と等しく、かつリクエストのリモートIPアドレスが 値として保存されている許可されたIPアドレスの配列で見つかる場合、true と評価します。

リクエスト元のユーザーとそのIPロケーションに基づいて変化する「動的」式
{
"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と評価されます。

  • フィールドの値が埋め込み式の場合、埋め込み式と同じ値として評価されます。 「埋め込み式 」を参照してください。

注意

ルールで%%argsまたは%%root展開が明示的に使用されていない場合、式フィールド名はデフォルトで同じ名前の引数またはドキュメント フィールドをチェックします。 たとえば、式{ "url": "https://www.example.com" }はデフォルトで、サービス ルールでは%%args.urlに対して値を評価し、MongoDB ルールでは%%root.urlに対して値を評価します。

展開は、式で動的な値を表す変数です。 展開は、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 を使用する場合、展開には特別な制限があります。 「同期互換拡張機能 」を参照してください。

%%true
Type: boolean
Usable In: Any Expression

trueと評価されます。 これを使用して、ネストされた式がtrueに評価される必要があることをアサートします。

%%false
Type: boolean
Usable In: Any Expression

falseと評価されます。 これを使用して、ネストされた式がfalseに評価される必要があることをアサートします。

%%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.id
Type: string
Usable In: Any Expression

認証されたユーザーの 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"
}
]
%%this
Type: any

データベース操作の最後に存在する特定のフィールドの値。

%%prev
Type: any

書込み操作によって変更される前の特定のフィールドの値。

%%root
Type: object

データベース操作の最後に存在する完全なドキュメント。

%%prevRoot
Type: object

書込み操作によって変更される前の完全なドキュメント。

以下は、ドキュメントが以前に存在していた(アクションが挿入ではない)か、ドキュメントのstatusフィールドの値が"new"の場合にtrueと評価される MongoDB スキーマ検証式です。

{
"%or": [
{ "%%prevRoot": { "%exists": %%true } },
{ "%%root.status": "new" }
]
}
%%args
Type: object

サービス アクションに引数として渡される値を含むドキュメント。 各引数には、パラメーター名でアクセスできます。

以下は、送信元の電話番号( from引数)が特定の値と一致する場合にtrueと評価されるTwilio のサービスルールです。

{
"%%args.from": "+15558675309"
}
%%partition
Type: string | number | BSON.ObjectId

パーティションベースの同期のみ) 現在評価されているパーティションのパーティションキー値。

式演算子は、式内のアクションまたは操作を表します。 演算子は 1 つ以上の引数を受け取り、結果値として評価されます。 結果の型と値は、使用する演算子とその結果に渡す引数によって異なります。

式演算子は、単一のパーセント記号( % )またはドル記号( $ )で始まる string によって表されます。 これらは任意の式で使用できます。

次の演算子を使用すると、EJSON と JSON 表現の間で値を変換できます。

%stringToOid

12 バイトまたは 24 バイトの string を EJSON objectIdオブジェクトに変換します。

{
"_id": {
"%stringToOid": "%%user.id"
}
}
%oidToString

EJSON objectIdオブジェクトを string に変換します。

{
"string_id": {
"%oidToString": "%%root._id"
}
}
%stringToUuid

36 バイトの string を EJSON UUIDオブジェクトに変換します。

{
"_id": {
"%stringToUuid": "%%user.id"
}
}
%uuidToString

EJSON UUIDオブジェクトを string に変換します。

{
"string_id": {
"%uuidToString": "%%root._id"
}
}

重要

内部操作なし

%stringToUuid%uuidToString%stringToOid%oidToStringは JSON 演算子を評価しません。 リテラル string/EJSON オブジェクトまたはいずれかに評価される展開を指定する必要があります。

次の演算子を使用すると、Atlas App Services アプリケーションで関数を呼び出すことができます。

%function

指定された名前と引数を持つ関数を呼び出します。 関数が返す値を評価します。

{
"%%true": {
"%function": {
"name": "isEven",
"arguments": [42]
}
}
}

次の演算子を使用すると、値がオブジェクトまたは配列に存在するかどうかを判断できます。

$exists

割り当てられているフィールドに値があるかどうかを確認します。 結果を表すブール値として評価されます。

{
"url": { "$exists": true }
}
$in

指定された値の配列をチェックして、その配列にこの演算子が割り当てられているフィールドの値が含まれているかどうかを確認します。 結果を表すブール値として評価されます。

{
"url": {
"$in": [
"https://www.example.com",
"https://www.mongodb.com"
]
}
}
$nin

指定された値の配列をチェックして、その配列にこの演算子が割り当てられているフィールドの値が含まれていないかどうかを確認します。 結果を表すブール値として評価されます。

{
"url": {
"$nin": [
"https://www.example.com",
"https://www.mongodb.com"
]
}
}

次の演算子を使用すると、展開された値を含む値を比較できます。

$eq

割り当てられているフィールドが指定された値と等しいかどうかを確認します。 結果を表すブール値として評価されます。

{ "score": { "$eq": 42 } }
$ne

割り当てられているフィールドが指定された値と等しくないかどうかを確認します。 結果を表すブール値として評価されます。

{ "numPosts": { "$ne": 0 } }
$gt

割り当てられているフィールドが指定された値を超えるかどうかを確認します。 結果を表すブール値として評価されます。

{ "score": { "$gt": 0 } }
$gte

割り当てられているフィールドが指定した値以上であるかどうかを確認します。 結果を表すブール値として評価されます。

{ "score": { "$gte": 0 } }
$lt

割り当てられているフィールドが指定された値未満であるかどうかを確認します。 結果を表すブール値として評価されます。

{ "score": { "$lt": 0 } }
$lte

割り当てられているフィールドが指定された値以下であるかどうかを確認します。 結果を表すブール値として評価されます。

{ "score": { "$lte": 0 } }

戻る

役割ベースの権限

項目一覧