Aturan: Jenis
.read
Memberi klien akses baca ke lokasi Firebase Realtime Database.
Aturan .read
adalah jenis Aturan Keamanan yang memberikan akses baca kepada klien ke lokasi Firebase Realtime Database. Contoh:
".read": "auth != null && auth.provider == 'twitter'"
Nilai aturan .read
adalah string, yang dievaluasi sebagai subset sintaksis ekspresi JavaScript dengan beberapa perubahan perilaku untuk meningkatkan kejelasan dan ketepatan. Aturan .read
yang memberikan izin untuk membaca lokasi juga akan mengizinkan pembacaan semua turunan lokasi tersebut, meskipun turunan memiliki aturan .read
sendiri yang gagal.
Aturan .read
memiliki akses ke semua Variabel Aturan Firebase Realtime Database, kecuali newData
.
.write
Memberi klien akses tulis ke lokasi Firebase Realtime Database.
Aturan .write
adalah jenis Aturan Keamanan yang memberikan akses tulis ke lokasi Firebase Realtime Database kepada klien. Contoh:
".write": "auth != null && auth.token.isAdmin == true"
Nilai aturan .write
adalah string, yang dievaluasi sebagai subset sintaksis ekspresi JavaScript dengan beberapa perubahan perilaku untuk meningkatkan kejelasan dan ketepatan. Aturan .write
yang memberikan izin untuk menulis ke suatu lokasi juga akan mengizinkan penulisan ke turunan lokasi tersebut, meskipun turunan memiliki aturan .write
sendiri yang gagal.
Aturan .write
memiliki akses ke semua Variabel Aturan Firebase Realtime Database.
.validate
Digunakan setelah aturan .write
memberikan akses, untuk memastikan bahwa data yang ditulis sesuai dengan skema tertentu.
Aturan .validate
digunakan setelah aturan .write
memberikan akses, untuk memastikan bahwa data yang ditulis sesuai dengan standar tertentu. Selain .write
yang memberikan akses, semua aturan .validate
yang relevan harus berhasil sebelum operasi tulis diizinkan. Contoh:
".validate": "newData.hasChildren(['name', 'age'])"
Nilai aturan .validate
adalah string, yang dievaluasi sebagai subset sintaksis ekspresi JavaScript dengan beberapa perubahan perilaku untuk meningkatkan kejelasan dan ketepatan.
Aturan .validate
memiliki akses ke semua Variabel Aturan Firebase Realtime Database.
.indexOn
Meningkatkan performa kueri dengan memberi tahu Firebase Realtime Database kunci mana yang data Anda ingin diindeks.
Aturan .indexOn
memberi tahu server Firebase Realtime Database untuk mengindeks kunci tertentu dalam data Anda guna meningkatkan performa kueri. Misalnya, pada database dengan kumpulan data dinosaurus, kita bisa memberi tahu Firebase Realtime Database untuk mengoptimalkan kueri, sebelum data ditampilkan dari server, dengan menambahkan aturan ini:
{
"rules": {
"dinosaurs": {
".indexOn": ["height", "length"]
}
}
}
Anda dapat mengetahui informasi selengkapnya tentang aturan .indexOn
dengan merujuk ke bagian panduan keamanan tentang mengindeks data Anda.
Aturan: Variabel
auth
Variabel yang berisi payload token jika klien diautentikasi, atau null
jika klien tidak diotentikasi.
Dengan Firebase Realtime Database, Anda dapat dengan mudah melakukan autentikasi ke beberapa penyedia bawaan dan akan membuat token autentikasi untuk penyedia tersebut. Setelah pengguna diautentikasi dengan salah satu penyedia bawaan, variabel autentikasi akan berisi hal berikut:
Kolom | Deskripsi |
---|---|
provider |
Metode autentikasi yang digunakan (misalnya "sandi", "anonim", "facebook", "github", "google", atau "twitter"). |
uid |
ID pengguna yang unik, harus unik di semua penyedia. |
token |
Isi token ID Firebase Auth. Lihat auth.token . |
Sebagai contoh, kita dapat memiliki aturan seperti berikut untuk mengizinkan pengguna membuat komentar selama mereka menyimpan ID pengguna dengan komentar tersebut:
{
"rules": {
".read": true,
"$comment": {
".write": "!data.exists() && newData.child('user_id').val() == auth.uid"
}
}
}
Kita juga dapat membuat aturan seperti berikut untuk memungkinkan pengguna membuat komentar selama mereka masuk menggunakan Facebook:
{
"rules": {
".read": true,
"$comment": {
".write": "!data.exists() && auth.provider == 'facebook'"
}
}
}
{i>auth.token<i}
Variabel yang berisi konten token ID Firebase Auth.
Token berisi beberapa atau semua kunci berikut:
Kolom | Deskripsi |
---|---|
email |
Alamat email yang terhubung dengan akun, jika ada. |
email_verified |
true jika pengguna telah memverifikasi bahwa mereka memiliki akses ke alamat email . Beberapa penyedia secara otomatis memverifikasi alamat email yang mereka miliki. |
phone_number |
Nomor telepon yang terkait dengan akun, jika ada. |
name |
Nama tampilan pengguna, jika ditetapkan. |
sub |
UID Firebase pengguna. UID ini bersifat unik dalam sebuah project. |
firebase.identities |
Kamus yang memuat semua identitas terkait akun pengguna ini. Kunci kamus dapat berupa salah satu dari berikut ini: email , phone , google.com , facebook.com , github.com , twitter.com . Nilai kamus adalah array ID unik untuk setiap penyedia identitas yang terkait dengan akun. Misalnya, auth.token.firebase.identities["google.com"][0] berisi ID pengguna Google pertama yang dikaitkan dengan akun. |
firebase.sign_in_provider |
Penyedia login yang digunakan untuk mendapatkan token ini. Dapat berupa salah satu string berikut: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com . |
firebase.tenant |
tenantId yang terkait dengan akun, jika ada. misalnya, tenant2-m6tyz |
Jika menggunakan autentikasi kustom, auth.token
juga berisi
klaim yang ditentukan oleh developer.
Semua nilai ini dapat digunakan dalam aturan. Misalnya, untuk membatasi akses ke Akun Google yang terkait dengan alamat gmail.com, kita dapat menambahkan aturan:
{
"rules": {
".read": "auth != null",
"gmailUsers": {
"$uid": {
".write": "auth.token.email_verified == true && auth.token.email.matches(/.*@gmail.com$/)"
}
}
}
}
Untuk kelengkapan, kolom berikut juga disertakan, dalam auth.token
, tetapi kolom tersebut kemungkinan tidak berguna untuk aturan.
Kolom | Deskripsi |
---|---|
iss |
Penerbit token. |
aud |
Audiens untuk token. |
auth_time |
Terakhir kali pengguna diautentikasi dengan kredensial menggunakan perangkat yang menerima token. |
iat |
Waktu token diterbitkan. |
exp |
Waktu habis masa berlaku token. |
$location
Variabel yang dapat digunakan untuk mereferensikan kunci $location
yang digunakan sebelumnya dalam struktur aturan.
Jika memiliki $location
dalam struktur aturan, Anda dapat menggunakan variabel $
yang cocok dalam ekspresi aturan untuk mendapatkan nama turunan sebenarnya yang dibaca atau ditulis. Misalkan kita ingin memberi setiap pengguna akses baca dan tulis ke lokasi /users/<user>
mereka sendiri. Kita bisa menggunakan:
{
"rules": {
"users": {
"$user": {
".read": "auth.uid === $user",
".write": "auth.uid === $user"
}
}
}
}
Saat klien mencoba mengakses /users/barney
, lokasi default $user
akan cocok dengan $user
yang sama dengan "barney". Jadi, aturan .read
akan memeriksa apakah auth.uid === 'barney'
. Akibatnya, pembacaan
hanya akan berhasil jika klien diautentikasi dengan uid "barney"./users/barney
sekarang
Berisi jumlah milidetik sejak epoch Unix menurut server Firebase Realtime Database.
Variabel now
berisi jumlah milidetik sejak epoch UNIX menurut server Firebase Realtime Database. Misalnya, Anda dapat menggunakan ini untuk memvalidasi bahwa waktu created
pengguna tidak pernah ditetapkan ke waktu di masa mendatang:
{
"rules": {
"users": {
"$user": {
"created": {
".validate": "newData.val() < now"
}
}
}
}
}
root
RuleDataSnapshot yang sesuai dengan data saat ini di root Firebase Realtime Database Anda.
Variabel root memberi Anda RuleDataSnapshot yang sesuai dengan data saat ini di root Firebase Realtime Database Anda. Anda dapat menggunakan ini untuk membaca data apa pun dalam database dalam ekspresi aturan. Misalnya, jika kita ingin mengizinkan pengguna membaca /comments
hanya jika /users/<id>/active
mereka ditetapkan ke benar (true), kita dapat menggunakan:
{
"rules": {
"comments": {
".read": "root.child('users').child(auth.uid).child('active').val() == true"
}
}
}
Kemudian, jika /users/barney/active
berisi nilai true, pengguna diautentikasi dengan uid "barney" dapat menulis ke node /comments
.
data
RuleDataSnapshot yang sesuai dengan data saat ini di Firebase Realtime Database di lokasi aturan yang sedang dijalankan.
Variabel data memberi Anda RuleDataSnapshot yang sesuai dengan data saat ini di lokasi database dari aturan yang sedang dieksekusi (bukan dengan root, yang memberi Anda data untuk root database Anda).
Jadi, misalnya, jika ingin mengizinkan klien mengakses /users/<user>
jika /users/<user>/public
ditetapkan ke true, Anda dapat menggunakan:
{
"rules": {
"users": {
"$user": {
".read": "data.child('public').val() == true"
}
}
}
}
Variabel data tersedia di .read
, .write
, dan
.validate
aturan.
newData
RuleDataSnapshot yang sesuai dengan data yang akan dihasilkan jika penulisan diizinkan.
Untuk aturan .write
dan .validate
, variabel newData memberi Anda RuleDataSnapshot yang sesuai dengan data yang akan dihasilkan jika penulisan diizinkan (ini adalah "penggabungan" data yang ada ditambah data baru yang sedang ditulis). Jadi, jika Anda ingin memastikan bahwa setiap pengguna memiliki nama dan usia, Anda dapat menggunakan:
{
"rules": {
"users": {
"$user": {
".read": true,
".write": true,
".validate": "newData.hasChildren(['name', 'age'])"
}
}
}
}
Karena newData menggabungkan data yang ada dan data baru, data akan berperilaku dengan baik bahkan untuk "sebagian" pembaruan. Contoh:
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();
Variabel newData tidak tersedia di aturan .read
karena tidak ada data baru yang ditulis. Sebaiknya Anda hanya menggunakan data.
RuleDataSnapshot: Metode
val()
Mendapatkan nilai primitif (string
, number
, boolean
, atau null
) dari RuleDataSnapshot ini.
Nilai Hasil: (String
, Number
, Boolean
, Null
) - Nilai dasar dari RuleDataSnapshot ini.
Tidak seperti DataSnapshot.val()
, memanggil val()
pada RuleDataSnapshot yang memiliki data turunan tidak akan menampilkan objek yang berisi turunan. Tindakan ini akan mengembalikan nilai sentinel khusus. Hal ini memastikan aturan selalu dapat beroperasi dengan sangat efisien.
Oleh karena itu, Anda harus selalu menggunakan child()
untuk mengakses turunan (mis. data.child('name').val()
, bukan data.val().name
).
Contoh ini hanya mengizinkan pembacaan jika turunan isReadable disetel ke true di lokasi yang sedang dibaca.
".read": "data.child('isReadable').val() == true"
turunan()
Mendapatkan RuleDataSnapshot untuk lokasi di jalur relatif yang ditentukan.
Argumen: childPath
String
- Jalur relatif ke lokasi data turunan.
Nilai Hasil: RuleDataSnapshot
- RuleDataSnapshot untuk lokasi turunan.
Jalur relatif dapat berupa nama turunan sederhana (misalnya, 'fred') atau jalur yang lebih dalam yang dipisahkan garis miring (misalnya, 'fred/name/first'). Jika lokasi turunan tidak memiliki data, RuleDataSnapshot kosong akan ditampilkan.
Contoh ini hanya mengizinkan pembacaan jika turunan isReadable disetel ke true di lokasi yang sedang dibaca.
".read": "data.child('isReadable').val() == true"
induk()
Mendapatkan RuleDataSnapshot untuk lokasi induk.
Nilai Hasil: RuleDataSnapshot
- RuleDataSnapshot untuk lokasi induk.
Jika instance ini merujuk ke root Firebase Realtime Database Anda, instance tersebut tidak memiliki induk, dan parent()
akan gagal, sehingga menyebabkan ekspresi aturan saat ini dilewati (sebagai kegagalan).
Contoh ini hanya mengizinkan pembacaan jika pasangan isReadable disetel ke true.
".read": "data.parent().child('isReadable').val() == true"
hasChild(childPath)
Menampilkan true (benar) jika turunan yang ditentukan ada.
Argumen: childPath
String
- Jalur relatif ke lokasi calon turunan.
Nilai Hasil: Boolean - true
jika data ada di jalur turunan yang ditentukan; lainnya false
.
Contoh ini hanya mengizinkan penulisan data jika berisi "nama" turunan.
".validate": "newData.hasChild('name')"
hasChildren([children])
Memeriksa keberadaan anak-anak.
Argumen: children
Array
opsional - Array kunci turunan yang semuanya harus ada.
Nilai Hasil: Boolean
- true
jika turunan (yang ditentukan) ada; lainnya false
.
Jika tidak ada argumen yang diberikan, argumen yang ditampilkan akan benar jika RuleDataSnapshot memiliki turunan apa pun. Jika array nama turunan diberikan, array nama turunan akan ditampilkan hanya jika semua turunan yang ditentukan ada di RuleDataSnapshot.
Contoh ini hanya memungkinkan penulisan data jika berisi satu atau beberapa turunan.
".validate": "newData.hasChildren()"
Contoh ini hanya memungkinkan data ditulis jika berisi "nama" dan "usia" anak-anak.
".validate": "newData.hasChildren(['name', 'age'])"
ada()
Menampilkan true (benar) jika RuleDataSnapshot ini berisi data apa pun.
Nilai Hasil: Boolean
- true
jika RuleDataSnapshot berisi data; yang lain false
.
Fungsi yang ada akan menampilkan nilai benar jika RuleDataSnapshot ini berisi data apa pun. Fungsi ini sepenuhnya merupakan fungsi kemudahan karena data.exists()
setara dengan data.val() != null
.
Contoh ini memungkinkan penulisan di lokasi ini selama tidak ada data yang ada.
".write": "!data.exists()"
getPriority()
Mendapatkan prioritas data dalam RuleDataSnapshot.
Nilai Hasil: (String
, Number
, Null
) - Prioritas data dalam RuleDataSnapshot ini.
Contoh ini memastikan bahwa data baru yang ditulis memiliki prioritas
".validate": "newData.getPriority() != null"
isNumber()
Menampilkan true jika RuleDataSnapshot ini berisi nilai numerik.
Nilai Hasil: Boolean
- true
jika data berupa numerik; lainnya false
.
Contoh ini memastikan bahwa data baru yang ditulis memiliki "usia" anak dengan nilai numerik.
".validate": "newData.child('age').isNumber()"
isString()
Menampilkan true (benar) jika RuleDataSnapshot ini berisi nilai string.
Nilai Hasil: Boolean
- true
jika data adalah String
; lainnya false
.
Contoh ini memastikan bahwa data baru yang ditulis memiliki "name" turunan dengan nilai string.
".validate": "newData.child('name').isString()
isBoolean()
Menampilkan true (benar) jika RuleDataSnapshot ini berisi nilai boolean.
Nilai Hasil: Boolean
- true
jika data adalah Boolean
; lainnya false
.
Contoh ini memastikan bahwa data baru yang ditulis memiliki turunan "aktif" dengan nilai boolean.
".validate": "newData.child('active').isBoolean()"
String: Properti
panjang
Menampilkan panjang string.
Nilai Hasil: Number
- Jumlah karakter dalam string.
Contoh ini mengharuskan string berisi minimal 10 karakter.
".validate": "newData.isString() && newData.val().length >= 10"
String: Metode
berisi(substring)
Menampilkan true (benar) jika string berisi substring yang ditentukan.
Argumen: substring
String
- Substring yang akan dicari.
Nilai Hasil: Boolean
- true
jika string berisi substring yang ditentukan; lainnya false
.
Contoh ini mengharuskan data menjadi string yang berisi "@".
".validate": "newData.isString() && newData.val().contains('@')"
dimulaiDengan(substring)
Menampilkan true (benar) jika string dimulai dengan substring yang ditentukan.
Argumen: substring
String
- Substring yang akan dicari di awal.
Nilai Hasil: Boolean
- true
jika string berisi substring yang ditentukan; lainnya false
.
Contoh ini mengizinkan akses baca jika auth.token.identifier
diawali dengan "internal-"
".read": "auth.token.identifier.beginsWith('internal-')"
endpointWith(substring)
Menampilkan true (benar) jika string diakhiri dengan substring yang ditentukan.
Argumen: substring
String
- Substring yang akan dicari di bagian akhir.
Nilai Hasil: Boolean
- true
jika string diakhiri dengan substring yang ditentukan; lainnya false
.
Contoh ini mengizinkan akses baca jika auth.token.identifier
diakhiri dengan "@perusahaan.com"
".read": "auth.token.identifier.endsWith('@company.com')"
ganti(substring, penggantian)
Menampilkan salinan string dengan semua instance dari substring yang ditentukan yang diganti dengan string pengganti yang ditentukan.
Argumen: substring String
- Substring yang akan dicari.
replacement String
- String untuk menggantikan substring.
Nilai Hasil: String
- String baru setelah mengganti substring dengan pengganti.
Metode replace()
sedikit berbeda dengan metode replace()
JavaScript karena mengganti semua instance substring yang ditentukan dengan string pengganti yang ditentukan, bukan hanya instance pertama.
Karena titik tidak diizinkan dalam kunci, kita perlu meng-escape string dengan titik sebelum menyimpannya. Contohnya adalah dengan alamat email. Misalkan kita memiliki daftar alamat email yang diizinkan di node /whitelist/
:
{
"user": {
"$uid": {
"email": <email>
}
},
"whitelist": {
"fred@gmail%2Ecom": true,
"barney@aol%2Ecom": true
}
}
Kita dapat membuat aturan yang hanya mengizinkan pengguna untuk ditambahkan jika email mereka berada di node /whitelist/
:
{
"rules": {
"users": {
"$uid": {
".read": "true",
".write": "root.child('whitelist').child(newData.child('email').val().replace('.', '%2E')).exists()"
}
}
}
}
{i>toLowerCase()<i}
Menampilkan salinan string yang dikonversi ke huruf kecil.
Nilai Hasil: String
- String yang dikonversi ke huruf kecil.
Contoh ini memungkinkan akses baca jika auth.token.identifier
karena semua huruf kecil ada di /users
.
".read": "root.child('users').child(auth.token.identifier.toLowerCase()).exists()"
toUpperCase()
Menampilkan salinan string yang dikonversi ke huruf besar.
Nilai Hasil: String
- String yang dikonversi ke huruf besar.
Contoh ini mengizinkan akses baca jika auth.token.identifier
karena semua huruf besar ada di bawah /users
.
".read": "root.child('users').child(auth.token.identifier.toUpperCase()).exists()"
cocok(regex)
Menampilkan true (benar) jika string cocok dengan literal ekspresi reguler yang ditentukan.
Nilai Hasil: Boolean
- true
jika string cocok dengan literal ekspresi reguler, ekspresi reguler; lainnya false
.
Lihat dokumentasi ekspresi reguler aturan lengkap.
Operator
+ (tambahkan)
Digunakan untuk menambahkan variabel atau untuk penyambungan string.
Contoh berikut memastikan bahwa nilai baru menambah nilai yang ada dengan tepat satu. Hal ini berguna untuk menerapkan penghitung:
".write": "newData.val() === data.val() + 1"
".validate": "root.child('room_names/' + $room_id).exists()"
- (negasi atau kurangi)
Digunakan untuk menegasikan nilai atau mengurangi dua nilai dalam ekspresi aturan.
Aturan validasi ini memeriksa apakah nilai baru adalah kebalikan dari nilai turunan di lokasi:
".validate": "newData.val() === -(data.child('quantity').val())"
Contoh berikut menggunakan pengurangan untuk memastikan bahwa hanya pesan dari sepuluh menit terakhir yang dapat dibaca:
".read": "newData.child('timestamp').val() > (now - 600000)"
* (kalikan)
Digunakan untuk mengalikan variabel dalam ekspresi aturan.
Aturan validasi ini memeriksa apakah nilai baru sama dengan produk harga dan jumlah (dua nilai yang sudah ada):
".validate": "newData.val() === data.child('price').val() * data.child('quantity').val()"
/ (bagi)
Digunakan untuk membagi variabel dalam ekspresi aturan.
Pada contoh berikut, aturan validasi memastikan bahwa data yang disimpan adalah rata-rata dari total data yang disimpan di tempat lain:
".validate": "newData.val() === data.parent().child('sum').val() / data.parent().child('numItems').val()"
% (modulus)
Digunakan untuk menemukan sisa pembagian satu variabel dengan variabel lain dalam ekspresi aturan.
Aturan ini memvalidasi bahwa hanya angka genap yang dapat ditulis:
".validate": "newData.val() % 2 === 0"
=== (sama dengan)
Digunakan untuk memeriksa apakah dua variabel dalam ekspresi aturan memiliki jenis dan nilai yang sama.
Aturan berikut menggunakan operator === untuk memberikan akses tulis hanya kepada pemilik akun pengguna. UID pengguna harus sama persis dengan kunci ($user_id
) agar aturan dapat dievaluasi ke true (benar).
"users": {
".write": "$user_id === auth.uid"
}
!== (tidak sama dengan)
Digunakan untuk memeriksa apakah dua variabel dalam ekspresi aturan tidak sama.
Aturan baca berikut memastikan bahwa hanya pengguna yang sudah login yang dapat membaca data:
".read": "auth !== null"
&& (DAN)
Mengevaluasi ke true (benar) jika kedua operand bernilai benar. Digunakan untuk mengevaluasi beberapa kondisi dalam ekspresi aturan.
Aturan validasi berikut memeriksa bahwa data baru berupa string yang kurang dari 100 karakter:
".validate": "newData.isString() && newData.val().length < 100"
|| (ATAU)
Mengevaluasi ke true (benar) jika satu operand dalam ekspresi aturan bernilai benar (true).
Dalam contoh ini, kita dapat menulis selama data lama atau data baru tidak ada. Dengan kata lain, kita dapat menulis apakah kita menghapus atau membuat data, tetapi tidak memperbarui data.
".write": "!data.exists() || !newData.exists()"
! (BUKAN)
Mengevaluasi ke true (benar) jika operand tunggalnya bernilai false. Dalam ekspresi aturan, ! operator sering digunakan untuk melihat apakah data telah ditulis ke suatu lokasi.
Aturan berikut hanya mengizinkan akses tulis jika tidak ada data di lokasi yang ditentukan:
".write": "!data.exists()"
> (lebih dari)
Digunakan untuk memeriksa apakah suatu nilai lebih besar dari nilai lain dalam ekspresi aturan.
Aturan validasi ini memeriksa bahwa string yang ditulis bukan string kosong:
".validate": "newData.isString() && newData.val().length > 0"
< (kurang dari)
Digunakan untuk memeriksa apakah suatu nilai i lebih kecil dari nilai lain dalam ekspresi aturan.
Aturan validasi ini memeriksa apakah string kurang dari 20 karakter:
".validate": "newData.isString() && newData.val().length < 20"
>= (lebih dari atau sama dengan)
Digunakan untuk memeriksa apakah suatu nilai lebih besar dari atau sama dengan nilai lain dalam ekspresi aturan.
Aturan validasi ini memeriksa bahwa string yang ditulis bukan string kosong:
".validate": "newData.isString() && newData.val().length >= 1"
<= (kurang dari atau sama dengan)
Digunakan untuk memeriksa apakah suatu nilai kurang dari atau sama dengan nilai lain dalam ekspresi aturan.
Aturan validasi ini memastikan bahwa data baru tidak dapat ditambahkan di masa mendatang:
".validate": "newData.val() <= now"
? (operator terner)
Digunakan untuk mengevaluasi ekspresi aturan bersyarat.
Operator ternary mengambil tiga operand. Operand sebelum ? adalah kondisinya. Jika kondisi bernilai true, operand kedua akan dievaluasi. Jika kondisinya salah, operand ketiga akan dievaluasi.
Untuk aturan validasi berikut, nilai baru dapat berupa angka atau boolean. Jika berupa angka, nilainya harus lebih besar dari 0.
".validate": "newData.isNumber() ? newData.val() > 0 : newData.isBoolean()"