개요
규칙 표현식 은 권한 을 사용하여 데이터 액세스를 제어하기 위해 작성하는 JSON 객체입니다. 각 표현식은 사용자가 조치를 취할 수 있는 조건을 정의합니다. 예를 들어, 사용자가 MongoDB 문서 또는 동기화된 영역에서 데이터를 읽거나 쓸 수 있는지 여부를 제어하는 표현식을 작성할 수 있습니다.
App Services는 일반적으로 문서를 입력으로 사용하여 규칙 표현식을 평가하여 참 또는 거짓 결과를 얻습니다.
하드코딩된 값을 사용하는 간단한 정적 표현식을 정의할 수 있습니다.
{ "id": "aaaabbbbccccddddeeeeffff" }
동적 요구 사항과 복잡하거나 사용자 지정 워크플로를 표현하기 위해 임의의 로직을 지원 하는 표현식을 쓰기 (write) 수도 있습니다. 동적 표현식 에는 현재 컨텍스트를 반영하는 확장 이라는 변수가 포함될 수 있으며 내장 연산자를 사용하여 데이터를 변환할 수 있습니다. 다음 예시 입력 문서의 owner
필드 사용자의 와 id
같고 요청 의 원격 IP 주소 값으로 저장된 허용된 IP 주소 배열 에서 찾을 수 있는 경우 참으로 평가됩니다.
{ "owner": "%%user.id", "%%request.remoteIPAddress": { "$in": "%%values.allowedClientIPAddresses" } }
제한 사항
Realm Mobile Sync를 사용할 때는 표현식에 특별한 제한이 있습니다. 동기화와 호환되는 표현식을 참조하세요.
표현식 구문
표현식은 부울 값(예: true
또는 false
) 또는 JSON 객체입니다.
표현식 객체 필드 이름은 값, 확장 또는 연산자 일 수 있습니다. 각 필드 에는 값, 확장 또는 중첩된 표현식 중 하나가 포함되어야 합니다.
표현식 객체의 형식은 다음과 같습니다.
{ <Value | Expansion | Operator>: <Value | Expression>, ... }
내장된 표현식
다른 표현식 문서의 필드에 여러 표현식 문서를 포함하여 복잡한 평가 로직을 처리할 수 있습니다. App Services는 후순으로 표현식을 깊이 우선적 으로 평가합니다.
예시
이 표현식은 someNumber
인수로 제공된 숫자가 특정 범위에 속하는 경우에만 true
로 평가됩니다.
{ "%%args.someNumber": { "%and": [ { "$gt": 0 }, { "$lte": 42 } ] } }
다중 필드 표현식
표현식에 둘 이상의 필드가 있는 경우 표현식의 모든 필드가 true로 평가되는 경우에만 해당 표현식은 true
로 평가됩니다. 즉, App Services는 단일 표현식의 여러 필드를 "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
와 같이 특정 컨텍스트로 제한되는 경우도 있습니다.
Realm Mobile 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서비스 조치 에 인수로 전달된 값이 포함된 문서입니다. 매개 변수 이름으로 각 인수에 액세스할 수 있습니다.
예시
다음은 발신자의 전화번호(
from
인수)가 특정 값과 일치하는 경우true
(으)로 평가하는 Twilio 서비스 규칙입니다.{ "%%args.from": "+15558675309" }
%%partition
- Type:
string | number | BSON.ObjectId
Usable In: Partion-based Sync(파티션 기반 동기화 만 해당) 평가 중인 현재 파티션의 파티션 키 값입니다.
연산자
표현식 연산자는 표현식 내의 조치를 나타냅니다. 연산자는 하나 이상의 인수를 받아 결과 값으로 평가합니다. 결과의 유형과 값은 사용하는 연산자와 해당 연산자에 전달하는 인수에 따라 달라집니다.
표현식 연산자는 단일 퍼센트 기호(%
) 또는 달러 기호($
)로 시작하는 문자열로 표시됩니다. 모든 표현식에 사용할 수 있습니다.
EJSON 값 변환
다음 연산자를 사용하면 EJSON과 JSON 표현 간에 값을 변환할 수 있습니다.
%stringToOid
12바이트 또는 24바이트 문자열을 EJSON
objectId
객체로 변환합니다.예시
{ "_id": { "%stringToOid": "%%user.id" } }
중요
내부 작업 없음
%stringToUuid
, %uuidToString
, %stringToOid
및 %oidToString
는 JSON 연산자를 평가하지 않습니다. 리터럴 string/EJSON 객체 또는 하나로 평가되는 확장 을 제공해야 합니다.
함수 호출
다음 연산자를 사용하면 App Services 애플리케이션에서 함수를 호출할 수 있습니다.
%function
지정된 이름과 인수를 사용하여 함수 를 호출합니다. 함수가 반환하는 값으로 평가합니다.
예시
{ "%%true": { "%function": { "name": "isEven", "arguments": [42] } } }
존재 확인
다음 연산자를 사용하면 값이 객체에 있는지 배열에 있는지 확인할 수 있습니다.
Compare Values
다음 연산자를 사용하면 확장된 값을 포함한 값을 비교할 수 있습니다.