규칙: 유형
.read
클라이언트에 Firebase 실시간 데이터베이스 위치에 대한 읽기 액세스 권한을 부여합니다.
.read
규칙은 Firebase 실시간 데이터베이스 위치에 대한 읽기 액세스 권한을 클라이언트에 부여하는 일종의 보안 규칙입니다. 예를 들면 다음과 같습니다.
".read": "auth != null && auth.provider == 'twitter'"
.read
규칙의 값은 문자열이며, 명확성과 정확성을 높이기 위해 몇 가지 동작 변경사항을 적용하여 JavaScript 표현식 구문의 하위 집합으로 평가됩니다. 위치 읽기 권한을 부여하는 .read
규칙은 하위 요소에 실패한 자체 .read
규칙이 있더라도 해당 위치의 모든 하위 요소 읽기도 허용합니다.
.read
규칙은 newData
를 제외한 Firebase 실시간 데이터베이스의 모든 규칙 변수에 액세스할 수 있습니다.
.write
클라이언트에 Firebase 실시간 데이터베이스 위치에 대한 쓰기 액세스 권한을 부여합니다.
.write
규칙은 Firebase 실시간 데이터베이스 위치에 대한 쓰기 액세스 권한을 클라이언트에 부여하는 일종의 보안 규칙입니다. 예를 들면 다음과 같습니다.
".write": "auth != null && auth.token.isAdmin == true"
.write
규칙의 값은 문자열이며, 명확성과 정확성을 높이기 위해 몇 가지 동작 변경사항을 적용하여 JavaScript 표현식 구문의 하위 집합으로 평가됩니다. 위치에 대한 쓰기 권한을 부여하는 .write
규칙은 하위 요소에 실패한 자체 .write
규칙이 있더라도 해당 위치의 모든 하위 요소에 쓸 수 있습니다.
.write
규칙은 Firebase 실시간 데이터베이스의 모든 규칙 변수에 액세스할 수 있습니다.
.validate
.write
규칙에서 액세스 권한을 부여하면 작성 중인 데이터가 특정 스키마를 준수하는지 확인하기 위해 사용됩니다.
.validate
규칙은 .write
규칙이 액세스 권한을 부여한 후 사용되어 기록되는 데이터가 특정 표준을 준수하도록 합니다. 액세스 권한을 부여하는 .write
외에도 모든 관련 .validate
규칙이 성공해야 쓰기가 허용됩니다. 예를 들면 다음과 같습니다.
".validate": "newData.hasChildren(['name', 'age'])"
.validate
규칙의 값은 문자열이며, 명확성과 정확성을 높이기 위해 몇 가지 동작 변경사항을 적용하여 JavaScript 표현식 구문의 하위 집합으로 평가됩니다.
.validate
규칙은 Firebase 실시간 데이터베이스의 모든 규칙 변수에 액세스할 수 있습니다.
.indexOn
Firebase 실시간 데이터베이스에 데이터의 색인을 생성할 키를 알려 쿼리 성능이 향상됩니다.
.indexOn
규칙은 쿼리 성능을 향상하기 위해 Firebase 실시간 데이터베이스 서버에 데이터의 특정 키의 색인을 생성하도록 지시합니다. 예를 들어 공룡 데이터 컬렉션이 있는 데이터베이스의 경우 다음 규칙을 추가하여 쿼리가 서버에서 반환되기 전에 Firebase 실시간 데이터베이스에 쿼리를 최적화하도록 지시할 수 있습니다.
{
"rules": {
"dinosaurs": {
".indexOn": ["height", "length"]
}
}
}
.indexOn
규칙에 관한 자세한 내용은 보안 가이드의 데이터 색인 생성 섹션을 참고하세요.
규칙: 변수
auth
클라이언트가 인증된 경우 토큰 페이로드를 포함하는 변수, 또는 null
확인할 수 있습니다
Firebase 실시간 데이터베이스를 사용하면 여러 기본 제공 제공업체를 쉽게 인증하고 이를 위한 인증 토큰을 생성할 수 있습니다. 기본 제공자 중 하나를 사용하여 사용자가 인증되면 auth 변수에는 다음이 포함됩니다.
필드 | 설명 |
---|---|
provider |
사용된 인증 방법입니다 (예: 'password', 'anonymous', 'facebook', 'github', 'google' 또는 'twitter') |
uid |
고유 사용자 ID(제공업체에 관계없이 항상 고유함) |
token |
Firebase 인증 ID 토큰의 콘텐츠입니다. auth.token 를 참조하세요. |
예를 들어 다음과 같은 규칙을 사용하여 사용자가 자신의 사용자 ID를 댓글과 함께 저장하는 한 사용자가 댓글을 작성할 수 있도록 허용할 수 있습니다.
{
"rules": {
".read": true,
"$comment": {
".write": "!data.exists() && newData.child('user_id').val() == auth.uid"
}
}
}
또한 사용자가 Facebook을 사용하여 로그인한 상태에서 댓글을 작성할 수 있도록 다음과 같은 규칙을 만들 수도 있습니다.
{
"rules": {
".read": true,
"$comment": {
".write": "!data.exists() && auth.provider == 'facebook'"
}
}
}
인증 토큰
Firebase 인증 ID 토큰의 콘텐츠가 포함된 변수입니다.
토큰에는 다음 키 중 일부 또는 전부가 포함됩니다.
필드 | 설명 |
---|---|
email |
계정과 연결된 이메일 주소(있는 경우)입니다. |
email_verified |
true 는 사용자가 email 주소에 대한 액세스 권한이 있는지 확인한 경우입니다. 일부 제공업체는 자동으로 자체 이메일 주소를 확인합니다. |
phone_number |
계정과 연결된 전화번호(있는 경우)입니다. |
name |
사용자의 표시 이름(설정된 경우)입니다. |
sub |
사용자의 Firebase UID입니다. 프로젝트 내에서 고유합니다. |
firebase.identities |
사용자 계정과 연결된 모든 ID의 사전입니다. 사전의 키는 email , phone , google.com , facebook.com , github.com , twitter.com 일 수 있습니다. 사전의 값은 계정과 연결된 각 ID 공급업체의 고유한 식별자 배열입니다. 예를 들어 auth.token.firebase.identities["google.com"][0] 에는 계정과 연결된 첫 번째 Google 사용자 ID가 포함됩니다. |
firebase.sign_in_provider |
토큰을 얻기 위해 사용된 로그인 제공업체입니다. 문자열 custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com 중 하나일 수 있습니다. |
firebase.tenant |
계정과 연결된 tenantId(있는 경우)입니다. 예: tenant2-m6tyz |
커스텀 인증을 사용하는 경우 auth.token
에는 모든 커스텀
소유권 주장이 있을 수 있습니다.
이러한 값은 모두 규칙 내에서 사용할 수 있습니다. 예를 들어 gmail.com 주소와 연결된 Google 계정에 대한 액세스를 제한하기 위해 다음과 같은 규칙을 추가할 수 있습니다.
{
"rules": {
".read": "auth != null",
"gmailUsers": {
"$uid": {
".write": "auth.token.email_verified == true && auth.token.email.matches(/.*@gmail.com$/)"
}
}
}
}
완전성을 위해 다음 필드도 auth.token
에 포함되어 있지만 규칙에는 유용하지 않습니다.
필드 | 설명 |
---|---|
iss |
토큰 발급자입니다. |
aud |
토큰의 대상입니다. |
auth_time |
사용자가 토큰을 수신하는 기기를 사용하여 사용자 인증 정보로 마지막으로 인증한 시간입니다. |
iat |
토큰이 발급된 시간입니다. |
exp |
토큰이 만료되는 시간입니다. |
$위치
이전에 규칙 구조에서 사용된 $location
의 키를 참조하는 데 사용할 수 있는 변수입니다.
규칙 구조에 $location
가 있으면 규칙 표현식 내에 일치하는 $
변수를 사용하여 읽거나 쓰고 있는 실제 하위 요소의 이름을 가져올 수 있습니다. 따라서 모든 사용자에게 자체 /users/<user>
위치에 대한 읽기 및 쓰기 액세스 권한을 부여한다고 가정해 보겠습니다. 다음과 같이 사용할 수 있습니다.
{
"rules": {
"users": {
"$user": {
".read": "auth.uid === $user",
".write": "auth.uid === $user"
}
}
}
}
클라이언트가 /users/barney
에 액세스하려고 하면 $user
기본 위치가 $user
가 'barney'와 일치하게 됩니다. 따라서 .read
규칙은 auth.uid === 'barney'
인지 확인합니다. 따라서 클라이언트가 'barney'의 uid로 인증된 경우에만
읽기가 성공합니다./users/barney
지금
Firebase 실시간 데이터베이스 서버에 따른 Unix 에포크 이후의 밀리초 수를 포함합니다.
now
변수에는 Firebase 실시간 데이터베이스 서버에 따른 UNIX 에포크 이후의 밀리초 수가 포함됩니다. 예를 들어, 이를 사용하여 사용자의 created
시간이 미래의 시간으로 설정되지 않았는지 확인할 수 있습니다.
{
"rules": {
"users": {
"$user": {
"created": {
".validate": "newData.val() < now"
}
}
}
}
}
루트
Firebase 실시간 데이터베이스의 루트에 있는 현재 데이터에 해당하는 RuleDataSnapshot입니다.
루트 변수는 Firebase 실시간 데이터베이스의 루트에 있는 현재 데이터에 해당하는 RuleDataSnapshot을 제공합니다. 이를 사용하여 규칙 표현식에서 데이터베이스의 모든 데이터를 읽을 수 있습니다. 예를 들어 /users/<id>/active
가 true로 설정된 경우에만 사용자가 /comments
를 읽을 수 있도록 하려면 다음을 사용하면 됩니다.
{
"rules": {
"comments": {
".read": "root.child('users').child(auth.uid).child('active').val() == true"
}
}
}
/users/barney/active
에 true 값이 포함된 경우 사용자가 'barney'의 UID로 인증한 것입니다. /comments
노드에 쓸 수 있습니다.
데이터
현재 실행 중인 규칙 위치에서 Firebase 실시간 데이터베이스의 현재 데이터에 해당하는 RuleDataSnapshot입니다.
데이터 변수는 데이터베이스 루트에 대한 데이터를 제공하는 루트와 달리 현재 실행 중인 규칙의 데이터베이스 위치에 있는 현재 데이터에 해당하는 RuleDataSnapshot을 제공합니다.
예를 들어 /users/<user>/public
가 true로 설정된 경우 모든 클라이언트가 /users/<user>
에 액세스할 수 있도록 하려면 다음을 사용하면 됩니다.
{
"rules": {
"users": {
"$user": {
".read": "data.child('public').val() == true"
}
}
}
}
데이터 변수는 .read
, .write
,
규칙 .validate
개
newData
쓰기가 허용되는 경우 생성되는 데이터에 해당하는 RuleDataSnapshot입니다.
.write
및 .validate
규칙의 경우 newData 변수는 쓰기가 허용되는 경우 발생할 데이터에 해당하는 RuleDataSnapshot을 제공합니다 (기존 데이터와 기록 중인 새 데이터의 '병합'). 따라서 모든 사용자에게 이름과 나이가 있는지 확인하려면 다음을 사용하면 됩니다.
{
"rules": {
"users": {
"$user": {
".read": true,
".write": true,
".validate": "newData.hasChildren(['name', 'age'])"
}
}
}
}
newData는 기존 데이터와 새 데이터를 병합하므로 '일부' 업데이트. 예를 들면 다음과 같습니다.
var fredRef = firebase.database().ref("users/fred");
// Valid since we have a name and age.
fredRef.set({ name: "Fred", age: 19 });
// Valid since we are updating the name but there's already an age.
fredRef.child("age").set(27);
// Invalid since the .validate rule will no longer be true.
fredRef.child("name").remove();
기록되는 새 데이터가 없으므로 .read
규칙에서 newData 변수를 사용할 수 없습니다. data만 사용해야 합니다.
RuleDataSnapshot: 메서드
값
이 RuleDataSnapshot에서 원시 값 (string
, number
, boolean
또는 null
)을 가져옵니다.
반환 값: (String
, Number
, Boolean
, Null
) - 이 RuleDataSnapshot의 프리미티브 값입니다.
DataSnapshot.val()
와 달리 하위 데이터가 있는 RuleDataSnapshot에서 val()
를 호출하면 하위 요소가 포함된 객체가 반환되지 않습니다. 대신 특수 센티널 값을 반환합니다. 이렇게 하면 규칙이 항상 매우 효율적으로 작동할 수 있습니다.
따라서 하위 요소에 액세스하려면 항상 child()
를 사용해야 합니다 (예: data.val().name
가 아닌 data.child('name').val()
).
이 예에서는 읽고 있는 위치에서 isReadable 하위 요소가 true로 설정된 경우에만 읽기를 허용합니다.
".read": "data.child('isReadable').val() == true"
하위()
지정된 상대 경로에 있는 위치의 RuleDataSnapshot을 가져옵니다.
인수: childPath
String
- 하위 데이터 위치의 상대 경로입니다.
반환 값: RuleDataSnapshot
- 하위 위치의 RuleDataSnapshot입니다.
상대 경로는 간단한 하위 이름 (예: 'fred')이거나 더 깊은 슬래시로 구분된 경로 (예: 'fred/name/first')일 수 있습니다. 하위 위치에 데이터가 없으면 빈 RuleDataSnapshot이 반환됩니다.
이 예에서는 읽고 있는 위치에서 isReadable 하위 요소가 true로 설정된 경우에만 읽기를 허용합니다.
".read": "data.child('isReadable').val() == true"
상위()
상위 위치의 RuleDataSnapshot을 가져옵니다.
반환 값: RuleDataSnapshot
- 상위 위치의 RuleDataSnapshot입니다.
이 인스턴스가 Firebase 실시간 데이터베이스의 루트를 참조하는 경우 상위 요소가 없고 parent()
가 실패하여 현재 규칙 표현식을 건너뜁니다 (실패로 간주됨).
이 예에서는 isReadable 동위 요소를 true로 설정한 경우에만 읽기를 허용합니다.
".read": "data.parent().child('isReadable').val() == true"
hasChild(childPath)
지정된 하위 요소가 있으면 true를 반환합니다.
인수: childPath
String
- 잠재적 하위 요소의 위치의 상대 경로입니다.
반환 값: 부울 - 데이터가 지정된 하위 경로에 있는 경우 true
이고, 그렇지 않으면 false
.
이 예에서는 하위 'name'이 포함된 경우에만 데이터를 쓸 수 있습니다.
".validate": "newData.hasChild('name')"
hasChildren([children])
하위 요소가 있는지 확인합니다.
인수: children
Array
선택사항 - 모두 존재해야 하는 하위 키의 배열입니다.
반환 값: Boolean
- 지정된 하위 요소가 있는 경우 true
입니다. 그렇지 않으면 false
입니다.
인수가 제공되지 않을 경우 RuleDataSnapshot에 하위 항목이 있으면 true를 반환합니다. 하위 이름 배열이 제공되는 경우 RuleDataSnapshot에 지정된 모든 하위 요소가 있는 경우에만 true를 반환합니다.
이 예시에서는 하위 요소가 하나 이상 포함된 경우에만 데이터를 쓸 수 있습니다.
".validate": "newData.hasChildren()"
이 예시에서는 'name'이 포함된 경우에만 데이터를 쓸 수 있습니다. 및 '연령' 있습니다.
".validate": "newData.hasChildren(['name', 'age'])"
존재()
이 RuleDataSnapshot에 데이터가 포함된 경우 true를 반환합니다.
반환 값: RuleDataSnapshot에 데이터가 포함된 경우 Boolean
- true
나머지는 false
입니다.
이 RuleDataSnapshot에 포함된 데이터가 있으면 존재 함수가 true를 반환합니다. 순수한 편의 함수입니다. data.exists()
가 data.val() != null
와 같기 때문입니다.
이 예에서는 기존 데이터가 없는 한 이 위치에 쓰기를 허용합니다.
".write": "!data.exists()"
getPriority()
RuleDataSnapshot에서 데이터 우선순위를 가져옵니다.
반환 값: (String
, Number
, Null
) - 이 RuleDataSnapshot에 있는 데이터의 우선순위입니다.
이 예에서는 기록되는 새 데이터에 우선순위가 부여되도록 합니다.
".validate": "newData.getPriority() != null"
isNumber()
이 RuleDataSnapshot에 숫자 값이 포함된 경우 true를 반환합니다.
반환 값: Boolean
- 데이터가 숫자인 경우 true
, 그렇지 않으면 false
입니다.
이 예에서는 기록되는 새 데이터에 하위 'age'가 포함됩니다. 사용할 수 있습니다.
".validate": "newData.child('age').isNumber()"
isString()
이 RuleDataSnapshot에 문자열 값이 포함된 경우 true를 반환합니다.
반환 값: Boolean
- 데이터가 String
인 경우 true
, 그 외에는 false
입니다.
이 예에서는 기록되는 새 데이터에 하위 'name'이 있습니다. .
".validate": "newData.child('name').isString()
isboolean()
이 RuleDataSnapshot에 불리언 값이 포함된 경우 true를 반환합니다.
반환 값: Boolean
- 데이터가 Boolean
인 경우 true
, 그렇지 않으면 false
입니다.
이 예에서는 기록되는 새 데이터에 하위 요소 'active'가 있음을 확인합니다. 을 전달합니다.
".validate": "newData.child('active').isBoolean()"
문자열: 속성
길이
문자열의 길이를 반환합니다.
반환 값: Number
- 문자열의 문자 수
이 예시에서는 문자열이 10자(영문 기준) 이상이어야 합니다.
".validate": "newData.isString() && newData.val().length >= 10"
문자열: 메서드
include(하위 문자열)
문자열에 지정된 하위 문자열이 포함되어 있으면 true를 반환합니다.
인수: substring
String
- 찾을 하위 문자열입니다.
반환 값: Boolean
- 문자열에 지정된 하위 문자열이 포함된 경우 true
입니다. 그렇지 않으면 false
입니다.
이 예에서는 데이터는 '@'를 포함하는 문자열이어야 합니다.
".validate": "newData.isString() && newData.val().contains('@')"
startWith(하위 문자열)
문자열이 지정된 하위 문자열로 시작하면 true를 반환합니다.
인수: substring
String
- 시작 부분에서 찾을 하위 문자열입니다.
반환 값: Boolean
- 문자열에 지정된 하위 문자열이 포함된 경우 true
입니다. 그렇지 않으면 false
입니다.
이 예시에서는 auth.token.identifier
가 'internal-'로 시작하면 읽기 액세스를 허용합니다.
".read": "auth.token.identifier.beginsWith('internal-')"
EndWith(하위 문자열)
문자열이 지정된 하위 문자열로 끝나면 true를 반환합니다.
인수: substring
String
- 끝부분에서 찾을 하위 문자열입니다.
반환 값: Boolean
- 문자열이 지정된 하위 문자열로 끝나는 경우 true
입니다. 그렇지 않으면 false
입니다.
이 예시에서는 auth.token.identifier
이 '@company.com'으로 끝나는 경우 읽기 액세스를 허용합니다.
".read": "auth.token.identifier.endsWith('@company.com')"
replace(하위 문자열, 대체)
지정된 하위 문자열의 모든 인스턴스를 지정된 대체 문자열로 바꾼 문자열 사본을 반환합니다.
인수: substring String
- 찾을 하위 문자열입니다.
replacement String
- 하위 문자열을 대체할 문자열입니다.
반환 값: String
- 하위 문자열을 대체 문자열로 바꾼 후의 새 문자열입니다.
replace()
메서드는 지정된 하위 문자열의 모든 인스턴스를 첫 번째 인스턴스만이 아니라 지정된 대체 문자열로 대체한다는 점에서 JavaScript replace()
메서드와 약간 다릅니다.
키에는 마침표가 허용되지 않으므로 저장하기 전에 문자열을 마침표로 이스케이프 처리해야 합니다. 이메일 주소를 예로 들 수 있습니다. /whitelist/
노드에 허용된 이메일 주소 목록이 있다고 가정해 보겠습니다.
{
"user": {
"$uid": {
"email": <email>
}
},
"whitelist": {
"fred@gmail%2Ecom": true,
"barney@aol%2Ecom": true
}
}
사용자의 이메일이 /whitelist/
노드에 있는 경우에만 사용자를 추가하도록 허용하는 규칙을 만들 수 있습니다.
{
"rules": {
"users": {
"$uid": {
".read": "true",
".write": "root.child('whitelist').child(newData.child('email').val().replace('.', '%2E')).exists()"
}
}
}
}
tolowerCase()
소문자로 변환된 문자열의 사본을 반환합니다.
반환 값: String
- 소문자로 변환된 문자열입니다.
이 예시에서는 모두 /users
아래에 소문자가 있으므로 auth.token.identifier
인 경우 읽기 액세스를 허용합니다.
".read": "root.child('users').child(auth.token.identifier.toLowerCase()).exists()"
toUpperCase()
대문자로 변환된 문자열의 사본을 반환합니다.
반환 값: String
- 대문자로 변환된 문자열입니다.
이 예시에서는 auth.token.identifier
가 모두 /users
아래에 대문자인 경우 읽기 액세스를 허용합니다.
".read": "root.child('users').child(auth.token.identifier.toUpperCase()).exists()"
일치(정규식)
문자열이 지정된 정규 표현식 리터럴과 일치하면 true를 반환합니다.
반환 값: Boolean
- 문자열이 정규 표현식 리터럴(regex)과 일치하는 경우 true
그렇지 않으면 false
입니다.
전체 규칙 정규식 문서를 참조하세요.
연산자
+ (더하기)
변수를 추가하거나 문자열을 연결하는 데 사용됩니다.
다음 예에서는 새 값이 기존 값을 정확히 1씩 증분합니다. 카운터 구현 시 유용합니다.
".write": "newData.val() === data.val() + 1"
".validate": "root.child('room_names/' + $room_id).exists()"
- (부정 또는 빼기)
규칙 표현식에서 값을 부정하거나 두 값을 빼는 데 사용됩니다.
이 유효성 검사 규칙은 새 값이 위치의 하위 값의 역인지 확인합니다.
".validate": "newData.val() === -(data.child('quantity').val())"
다음은 빼기를 사용하여 지난 10분 동안의 메시지만 읽을 수 있도록 하는 예시입니다.
".read": "newData.child('timestamp').val() > (now - 600000)"
* (곱하기)
규칙 표현식에서 변수를 곱하는 데 사용됩니다.
이 유효성 검사 규칙은 새 값이 가격 및 수량 (기존 값 2개)의 생산값과 일치하는지 확인합니다.
".validate": "newData.val() === data.child('price').val() * data.child('quantity').val()"
/ (나누기)
규칙 표현식에서 변수를 나누는 데 사용됩니다.
다음 예에서 유효성 검사 규칙은 저장된 데이터가 다른 곳에 저장된 총 데이터의 평균인지 확인합니다.
".validate": "newData.val() === data.parent().child('sum').val() / data.parent().child('numItems').val()"
% (계수)
규칙 표현식에서 한 변수를 다른 변수로 나눈 나머지를 구하는 데 사용됩니다.
이 규칙은 짝수만 쓸 수 있는지 확인합니다.
".validate": "newData.val() % 2 === 0"
=== (같음)
규칙 표현식의 두 변수의 유형과 값이 동일한지 확인하는 데 사용됩니다.
다음 규칙은 === 연산자를 사용하여 사용자 계정 소유자에게만 쓰기 액세스 권한을 부여합니다. 규칙이 true로 판정되려면 사용자의 uid가 키 ($user_id
)와 정확히 일치해야 합니다.
"users": {
".write": "$user_id === auth.uid"
}
!== (같지 않음)
규칙 표현식의 두 변수가 같지 않은지 확인하는 데 사용됩니다.
다음 읽기 규칙은 로그인한 사용자만 데이터를 읽을 수 있도록 합니다.
".read": "auth !== null"
&& (및)
두 피연산자가 모두 true이면 true로 평가됩니다. 규칙 표현식에서 여러 조건을 평가하는 데 사용됩니다.
다음 유효성 검사 규칙은 새 데이터가 100자(영문 기준) 미만의 문자열인지 확인합니다.
".validate": "newData.isString() && newData.val().length < 100"
|| (또는)
규칙 표현식의 한 피연산자가 true인 경우 true로 평가됩니다.
이 예시에서는 이전 데이터나 새 데이터가 존재하지 않는 한 쓸 수 있습니다. 즉, 데이터를 삭제하거나 만들 수는 있지만 데이터를 업데이트하지 않는 경우에도 데이터를 쓸 수 있습니다.
".write": "!data.exists() || !newData.exists()"
! (제외)
단일 피연산자가 false인 경우 true로 평가됩니다. 규칙 표현식에서 ! 연산자는 데이터가 위치에 쓰였는지 확인하는 데 자주 사용됩니다.
다음 규칙은 지정된 위치에 데이터가 없는 경우에만 쓰기 액세스를 허용합니다.
".write": "!data.exists()"
>(보다 큼)
값이 규칙 표현식의 다른 값보다 큰지 확인하는 데 사용됩니다.
이 유효성 검사 규칙은 작성 중인 문자열이 빈 문자열이 아닌지 확인합니다.
".validate": "newData.isString() && newData.val().length > 0"
<(보다 작음)
규칙 표현식의 다른 값보다 값이 작은지 확인하는 데 사용됩니다.
이 유효성 검사 규칙은 문자열이 20자(영문 기준) 미만인지 확인합니다.
".validate": "newData.isString() && newData.val().length < 20"
>=(크거나 같음)
값이 규칙 표현식의 다른 값보다 크거나 같은지 확인하는 데 사용됩니다.
이 유효성 검사 규칙은 작성 중인 문자열이 빈 문자열이 아닌지 확인합니다.
".validate": "newData.isString() && newData.val().length >= 1"
<=(작거나 같음)
값이 규칙 표현식의 다른 값보다 작거나 같은지 확인하는 데 사용됩니다.
이 유효성 검사 규칙을 사용하면 향후 새 데이터를 추가할 수 없습니다.
".validate": "newData.val() <= now"
? (3항 연산자)
조건부 규칙 표현식을 평가하는 데 사용됩니다.
3항 연산자에는 3개의 피연산자가 사용됩니다. ? 앞의 피연산자 조건입니다. 조건이 true로 평가되면 두 번째 피연산자가 평가됩니다. 조건이 false이면 세 번째 피연산자가 평가됩니다.
다음 확인 규칙의 경우 새 값은 숫자 또는 불리언일 수 있습니다. 숫자인 경우 0보다 커야 합니다.
".validate": "newData.isNumber() ? newData.val() > 0 : newData.isBoolean()"