API Quy tắc bảo mật cơ sở dữ liệu Firebase

Quy tắc: Loại

.đọc

Cấp cho ứng dụng quyền đọc vị trí của Cơ sở dữ liệu theo thời gian thực Firebase.

Quy tắc .read là một loại Quy tắc bảo mật cấp cho ứng dụng quyền đọc thông tin vị trí của Cơ sở dữ liệu theo thời gian thực của Firebase. Ví dụ:

 ".read": "auth != null && auth.provider == 'twitter'"

Giá trị của quy tắc .read là một chuỗi. Chuỗi này được đánh giá dưới dạng một tập hợp con cú pháp biểu thức của JavaScript cùng với một vài thay đổi về hành vi để tăng độ rõ ràng và độ chính xác. Quy tắc .read cấp quyền đọc một vị trí cũng sẽ cho phép đọc mọi phần tử con cháu của vị trí đó, ngay cả khi các phần tử con đó có quy tắc .read riêng bị lỗi.

Quy tắc .read có quyền truy cập vào tất cả các Biến quy tắc của Cơ sở dữ liệu theo thời gian thực Firebase, ngoại trừ newData.

.ghi

Cấp cho ứng dụng khách quyền ghi vào vị trí của Cơ sở dữ liệu theo thời gian thực Firebase.

Quy tắc .write là một loại Quy tắc bảo mật cấp cho ứng dụng khách quyền ghi vào vị trí Cơ sở dữ liệu theo thời gian thực của Firebase. Ví dụ:

".write": "auth != null && auth.token.isAdmin == true"

Giá trị của quy tắc .write là một chuỗi. Chuỗi này được đánh giá dưới dạng một tập hợp con cú pháp biểu thức của JavaScript cùng với một vài thay đổi về hành vi để tăng độ rõ ràng và độ chính xác. Quy tắc .write cấp quyền ghi một vị trí cũng sẽ cho phép ghi cho mọi thành phần con của vị trí đó, ngay cả khi các thành phần con có quy tắc .write riêng không thành công.

Quy tắc .write có quyền truy cập vào tất cả các Biến quy tắc của Cơ sở dữ liệu theo thời gian thực Firebase.

xác thực

Được dùng sau khi quy tắc .write cấp quyền truy cập, để đảm bảo rằng dữ liệu đang được ghi tuân theo một giản đồ cụ thể.

Quy tắc .validate được dùng sau khi quy tắc .write cấp quyền truy cập, để đảm bảo dữ liệu được ghi tuân theo một tiêu chuẩn cụ thể. Ngoài việc cấp quyền truy cập .write, tất cả quy tắc .validate có liên quan đều phải thành công trước khi cho phép ghi. Ví dụ:

".validate": "newData.hasChildren(['name', 'age'])"

Giá trị của quy tắc .validate là một chuỗi. Chuỗi này được đánh giá dưới dạng một tập hợp con cú pháp biểu thức của JavaScript cùng với một vài thay đổi về hành vi để tăng độ rõ ràng và độ chính xác.

Quy tắc .validate có quyền truy cập vào tất cả các Biến quy tắc của Cơ sở dữ liệu theo thời gian thực Firebase.

.indexOn

Cải thiện hiệu suất truy vấn bằng cách cho Cơ sở dữ liệu theo thời gian thực của Firebase biết những khoá mà bạn muốn lập chỉ mục dữ liệu.

Quy tắc .indexOn yêu cầu các máy chủ Cơ sở dữ liệu theo thời gian thực của Firebase lập chỉ mục các khoá cụ thể trong dữ liệu của bạn để cải thiện hiệu suất của các truy vấn. Ví dụ: với một cơ sở dữ liệu có một bộ sưu tập dữ liệu khủng long, chúng tôi có thể cho Cơ sở dữ liệu theo thời gian thực của Firebase tối ưu hoá cho các truy vấn trước khi các truy vấn đó được máy chủ trả về bằng cách thêm quy tắc sau:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Bạn có thể tìm hiểu thêm thông tin về quy tắc .indexOn bằng cách tham khảo phần hướng dẫn bảo mật về cách lập chỉ mục dữ liệu của bạn.

Quy tắc: Biến

xác thực

Một biến chứa tải trọng mã thông báo nếu ứng dụng được xác thực, hoặc null nếu khách hàng không được xác thực.

Cơ sở dữ liệu theo thời gian thực của Firebase cho phép bạn dễ dàng xác thực với một số nhà cung cấp được tích hợp sẵn và sẽ tạo mã thông báo xác thực cho họ. Sau khi người dùng được xác thực bằng một trong các nhà cung cấp tích hợp sẵn, biến xác thực sẽ chứa các thông tin sau:

Trường Mô tả
provider Phương thức xác thực được sử dụng (ví dụ: "password", "anonymous", "facebook", "github", "google" hoặc "twitter").
uid Mã nhận dạng người dùng duy nhất, đảm bảo là duy nhất trên tất cả các nhà cung cấp.
token Nội dung của mã thông báo mã xác thực Firebase. Hãy xem auth.token.

Ví dụ: chúng ta có thể có một quy tắc như sau để cho phép người dùng tạo bình luận, miễn là họ lưu trữ mã nhận dạng người dùng của bình luận đó:

{
  "rules": {
    ".read": true,
    "$comment": {
      ".write": "!data.exists() && newData.child('user_id').val() == auth.uid"
    }
  }
}

Chúng ta cũng có thể tạo một quy tắc như sau để cho phép người dùng tạo bình luận miễn là họ đã đăng nhập bằng Facebook:

{
  "rules": {
    ".read": true,
    "$comment": {
      ".write": "!data.exists() && auth.provider == 'facebook'"
    }
  }
}

auth.token

Một biến chứa nội dung của mã thông báo mã xác thực Firebase.

Mã thông báo chứa một số hoặc tất cả các khoá sau:

Trường Mô tả
email Địa chỉ email được liên kết với tài khoản (nếu có).
email_verified true nếu người dùng đã xác minh rằng họ có quyền truy cập vào địa chỉ email. Một số nhà cung cấp tự động xác minh địa chỉ email mà họ sở hữu.
phone_number Số điện thoại được liên kết với tài khoản, nếu có.
name Tên hiển thị của người dùng (nếu có).
sub UID trên Firebase của người dùng. Đây là giá trị duy nhất trong một dự án.
firebase.identities Từ điển về tất cả danh tính liên kết với tài khoản của người dùng này. Khoá của từ điển có thể là bất kỳ khoá nào sau đây: email, phone, google.com, facebook.com, github.com, twitter.com. Giá trị của từ điển là các mảng mã nhận dạng duy nhất cho từng nhà cung cấp danh tính được liên kết với tài khoản. Ví dụ: auth.token.firebase.identities["google.com"][0] chứa mã nhận dạng người dùng Google đầu tiên được liên kết với tài khoản.
firebase.sign_in_provider Nhà cung cấp dịch vụ đăng nhập dùng để lấy mã thông báo này. Có thể là một trong các chuỗi sau: custom, password, phone, anonymous, google.com, facebook.com, github.com, twitter.com.
firebase.tenant Mã người thuê được liên kết với tài khoản (nếu có). ví dụ: tenant2-m6tyz

Nếu sử dụng phương thức xác thực tuỳ chỉnh, auth.token cũng chứa mọi tuỳ chọn tuyên bố do nhà phát triển chỉ định.

Có thể sử dụng tất cả các giá trị này trong quy tắc. Ví dụ: để hạn chế quyền truy cập vào Tài khoản Google được liên kết với địa chỉ gmail.com, chúng ta có thể thêm quy tắc:

{
  "rules": {
    ".read": "auth != null",
    "gmailUsers": {
      "$uid": {
        ".write": "auth.token.email_verified == true && auth.token.email.matches(/.*@gmail.com$/)"
      }
    }
  }
}

Để hoàn chỉnh, các trường sau cũng được đưa vào trong auth.token, nhưng có thể sẽ không hữu ích cho các quy tắc.

Trường Mô tả
iss Nhà phát hành mã thông báo.
aud Đối tượng của mã thông báo.
auth_time Lần cuối cùng người dùng xác thực bằng một thông tin xác thực bằng cách sử dụng thiết bị nhận mã thông báo.
iat Thời điểm phát hành mã thông báo.
exp Thời gian mã thông báo hết hạn.

$location

Một biến có thể dùng để tham chiếu khoá của $location đã được dùng trước đó trong cấu trúc quy tắc.

Khi có $location trong cấu trúc quy tắc, bạn có thể sử dụng biến $ trùng khớp trong biểu thức quy tắc để lấy tên của phần tử con thực sự đang được đọc hoặc ghi. Vì vậy, giả sử chúng ta muốn cấp cho mọi người dùng quyền đọc và ghi vào vị trí /users/<user> của riêng họ. Chúng ta có thể dùng:

{
  "rules": {
    "users": {
      "$user": {
        ".read": "auth.uid === $user",
        ".write": "auth.uid === $user"
      }
    }
  }
}

Khi ứng dụng cố gắng truy cập vào /users/barney, vị trí mặc định của $user sẽ khớp với $user bằng "barney". Vì vậy, quy tắc .read sẽ kiểm tra xem auth.uid === 'barney' có phải không. Do đó, việc đọc /users/barney sẽ chỉ thành công nếu ứng dụng được xác thực bằng uid là "barney".

bây giờ

Chứa số mili giây kể từ thời gian bắt đầu của hệ thống Unix theo máy chủ Cơ sở dữ liệu thời gian thực Firebase.

Biến now chứa số mili giây kể từ thời gian bắt đầu của hệ thống UNIX theo máy chủ Cơ sở dữ liệu theo thời gian thực của Firebase. Ví dụ: bạn có thể sử dụng phương thức này để xác thực rằng thời gian created của người dùng không bao giờ được đặt thành thời gian trong tương lai:

{
  "rules": {
    "users": {
      "$user": {
        "created": {
          ".validate": "newData.val() < now"
        }
      }
    }
  }
}

gốc

Một RuleDataSnapshot tương ứng với dữ liệu hiện tại ở gốc của Cơ sở dữ liệu theo thời gian thực của Firebase.

Biến gốc cung cấp cho bạn một RuleDataSnapshot tương ứng với dữ liệu hiện tại ở gốc của Cơ sở dữ liệu theo thời gian thực Firebase. Bạn có thể sử dụng tính năng này để đọc mọi dữ liệu trong cơ sở dữ liệu trong biểu thức quy tắc. Ví dụ: nếu muốn cho phép người dùng chỉ đọc /comments khi /users/<id>/active của họ được đặt thành true, chúng ta có thể sử dụng:

{
  "rules": {
    "comments": {
      ".read": "root.child('users').child(auth.uid).child('active').val() == true"
    }
  }
}

Sau đó, nếu /users/barney/active chứa giá trị true, người dùng sẽ được xác thực bằng uid là "barney" có thể ghi vào nút /comments.

dữ liệu

Một RuleDataSnapshot tương ứng với dữ liệu hiện tại trong Cơ sở dữ liệu theo thời gian thực của Firebase tại vị trí của quy tắc đang thực thi.

Biến dữ liệu cung cấp cho bạn một RuleDataSnapshot tương ứng với dữ liệu hiện tại ở vị trí cơ sở dữ liệu của quy tắc đang thực thi (trái ngược với quy tắc gốc, cung cấp cho bạn dữ liệu gốc của cơ sở dữ liệu).

Vì vậy, nếu muốn cho phép ứng dụng bất kỳ truy cập vào /users/<user> nếu /users/<user>/public được đặt thành true, bạn có thể sử dụng:

{
  "rules": {
    "users": {
      "$user": {
        ".read": "data.child('public').val() == true"
      }
    }
  }
}

Biến dữ liệu có sẵn trong .read, .write.validate quy tắc.

dữ liệu mới

Một RuleDataSnapshot tương ứng với dữ liệu sẽ tạo ra nếu được phép ghi.

Đối với các quy tắc .write.validate, biến newData cung cấp cho bạn một RuleDataSnapảnh tương ứng với dữ liệu sẽ tạo ra nếu được phép ghi (đây là sự "hợp nhất" giữa dữ liệu hiện có và dữ liệu mới đang được ghi). Vì vậy, nếu bạn muốn đảm bảo rằng mọi người dùng đều có tên và tuổi, bạn có thể sử dụng:

{
  "rules": {
    "users": {
      "$user": {
        ".read": true,
        ".write": true,
        ".validate": "newData.hasChildren(['name', 'age'])"
      }
    }
  }
}

Vì newData hợp nhất dữ liệu hiện có và dữ liệu mới, nên dữ liệu này sẽ hoạt động đúng cách ngay cả đối với "một phần" bản cập nhật. Ví dụ:

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();

Biến newData không có sẵn trong các quy tắc .read vì không có dữ liệu mới nào đang được ghi. Bạn chỉ nên sử dụng dữ liệu.

RuleDataSnapảnh: Phương thức

giá trị val()

Lấy giá trị gốc (string, number, boolean hoặc null) từ RuleDataSnapảnh này.

Giá trị trả về: (String, Number, Boolean, Null) – Giá trị gốc của RuleDataSnapshot này.

Không giống như DataSnapshot.val(), việc gọi val() trên RuleDataSnapshot có dữ liệu con sẽ không trả về đối tượng chứa phần tử con. Thay vào đó, hàm này sẽ trả về một giá trị trọng điểm đặc biệt. Điều này đảm bảo các quy tắc luôn có thể hoạt động cực kỳ hiệu quả.

Do đó, bạn phải luôn sử dụng child() để truy cập vào phần tử con (ví dụ: data.child('name').val(), không phải data.val().name).

Ví dụ này chỉ cho phép đọc nếu thành phần con isReadable được đặt thành true tại vị trí đang được đọc.

".read": "data.child('isReadable').val() == true"

con()

Nhận RuleDataSnap chụp cho vị trí tại đường dẫn tương đối được chỉ định.

Đối số: childPath String – Một đường dẫn tương đối đến vị trí của dữ liệu con.

Giá trị trả về: RuleDataSnapshotRuleDataSnapshot cho vị trí con.

Đường dẫn tương đối có thể là một tên con đơn giản (ví dụ: "fred") hoặc đường dẫn sâu hơn được phân tách bằng dấu gạch chéo (ví dụ: "fred/name/first"). Nếu vị trí con không có dữ liệu, thì một RuleDataSnapshot trống sẽ được trả về.

Ví dụ này chỉ cho phép đọc nếu thành phần con isReadable được đặt thành true tại vị trí đang được đọc.

".read": "data.child('isReadable').val() == true"

mẹ()

Nhận RuleDataSnapshot cho vị trí chính.

Giá trị trả về: RuleDataSnapshotRuleDataSnapshot cho vị trí gốc.

Nếu đây là thư mục gốc của Cơ sở dữ liệu theo thời gian thực trên Firebase, thì phiên bản này sẽ không có thư mục gốc và parent() sẽ không thành công, khiến biểu thức quy tắc hiện tại bị bỏ qua (do không thành công).

Ví dụ này chỉ cho phép đọc nếu đồng cấp isReadable được đặt thành true.

".read": "data.parent().child('isReadable').val() == true"

hasChild(childPath)

Trả về true nếu con được chỉ định tồn tại.

Đối số: childPath String – Một đường dẫn tương đối đến vị trí của trẻ tiềm năng.

Giá trị trả về: Booleantrue nếu dữ liệu tồn tại tại đường dẫn con được chỉ định; false khác.

Ví dụ này chỉ cho phép ghi dữ liệu nếu có chứa "tên" con.

".validate": "newData.hasChild('name')"

cóTrẻ em([trẻ em])

Kiểm tra sự tồn tại của trẻ em.

Đối số: children Array không bắt buộc – Một mảng các khoá con phải tồn tại.

Giá trị trả về: Booleantrue nếu con (được chỉ định) tồn tại; khác false.

Nếu không có đối số nào được cung cấp, đối số này sẽ trả về true nếu RuleDataSnapshot có bất kỳ phần tử con nào. Nếu một mảng tên phần tử con được cung cấp, cột này sẽ chỉ trả về true nếu tất cả các phần tử con được chỉ định tồn tại trong RuleDataSnapshot.

Ví dụ này chỉ cho phép ghi dữ liệu nếu dữ liệu chứa một hoặc nhiều phần tử con.

".validate": "newData.hasChildren()"

Ví dụ này chỉ cho phép ghi dữ liệu nếu dữ liệu có chứa "name" và "age" trẻ em.

".validate": "newData.hasChildren(['name', 'age'])"

tồn tại()

Trả về true nếu RuleDataSnapshot này chứa bất kỳ dữ liệu nào.

Giá trị trả về: Booleantrue nếu RuleDataSnapshot chứa bất kỳ dữ liệu nào; false khác.

Hàm tồn tại sẽ trả về giá trị true nếu RuleDataSnapshot này chứa dữ liệu bất kỳ. Đây chỉ là một hàm tiện lợi vì data.exists() tương đương với data.val() != null.

Ví dụ này cho phép ghi tại vị trí này miễn là chưa có dữ liệu.

".write": "!data.exists()"

getPriority()

Lấy mức độ ưu tiên của dữ liệu trong RuleDataSnapshot.

Giá trị trả về: (String, Number, Null) – Mức độ ưu tiên của dữ liệu trong RuleDataSnapshot này.

Ví dụ này đảm bảo rằng dữ liệu mới đang được ghi có mức độ ưu tiên

".validate": "newData.getPriority() != null"

isNumber()

Trả về true nếu RuleDataSnapshot này chứa giá trị số.

Giá trị trả về: Booleantrue nếu dữ liệu là số; khác false.

Ví dụ này đảm bảo rằng dữ liệu mới đang được ghi có "tuổi" của trẻ có giá trị số.

".validate": "newData.child('age').isNumber()"

isString()

Trả về true nếu RuleDataSnapshot này chứa giá trị chuỗi.

Giá trị trả về: Booleantrue nếu dữ liệu là String; khác false.

Ví dụ này đảm bảo rằng dữ liệu mới đang được ghi có "tên" con có giá trị chuỗi.

".validate": "newData.child('name').isString()

Hàm isBoolean()

Trả về true nếu RuleDataSnapshot này chứa giá trị boolean.

Giá trị trả về: Booleantrue nếu dữ liệu là Boolean; khác false.

Ví dụ này đảm bảo rằng dữ liệu mới đang được ghi có phần tử con "đang hoạt động" với một giá trị boolean.

".validate": "newData.child('active').isBoolean()"

Chuỗi: Thuộc tính

chiều dài

Trả về độ dài của chuỗi.

Giá trị trả về: Number – Số ký tự trong chuỗi.

Ví dụ này yêu cầu chuỗi phải có ít nhất 10 ký tự.

".validate": "newData.isString() && newData.val().length >= 10"

Chuỗi: Phương thức

chứa(chuỗi con)

Trả về true nếu chuỗi chứa chuỗi con đã chỉ định.

Đối số: substring String – Chuỗi con cần tìm.

Giá trị trả về: Booleantrue nếu chuỗi chứa chuỗi con đã chỉ định; khác false.

Ví dụ này yêu cầu dữ liệu phải là một chuỗi có chứa "@".

".validate": "newData.isString() && newData.val().contains('@')"

bắt đầu Bằng(chuỗi con)

Trả về true nếu chuỗi bắt đầu bằng chuỗi con đã chỉ định.

Đối số: substring String – Chuỗi con cần tìm ở đầu.

Giá trị trả về: Booleantrue nếu chuỗi chứa chuỗi con đã chỉ định; khác false.

Ví dụ này cho phép quyền đọc nếu auth.token.identifier bắt đầu bằng "internal-"

".read": "auth.token.identifier.beginsWith('internal-')"

kết thúc bằng(chuỗi con)

Trả về true nếu chuỗi kết thúc bằng chuỗi con đã chỉ định.

Đối số: substring String – Chuỗi con cần tìm ở cuối.

Giá trị trả về: Booleantrue nếu chuỗi kết thúc bằng chuỗi con đã chỉ định; khác false.

Ví dụ này cho phép quyền đọc nếu auth.token.identifier kết thúc bằng "@company.com"

".read": "auth.token.identifier.endsWith('@company.com')"

thay thế(chuỗi con; thay thế)

Trả về bản sao của chuỗi, trong đó tất cả các bản sao của một chuỗi con được chỉ định sẽ được thay thế bằng chuỗi thay thế được chỉ định.

Đối số: substring String – Chuỗi con cần tìm. replacement String – Một chuỗi để thay thế chuỗi con.

Giá trị trả về: String – Chuỗi mới sau khi thay thế chuỗi con bằng chuỗi thay thế.

Phương thức replace() khác một chút so với phương thức replace() của JavaScript ở chỗ phương thức này thay thế mọi bản sao của chuỗi con đã chỉ định bằng chuỗi thay thế được chỉ định, chứ không chỉ bản sao đầu tiên.

Vì dấu chấm không được phép trong khoá, nên chúng ta cần thoát chuỗi bằng dấu chấm trước khi lưu trữ. Một ví dụ về điều này là với địa chỉ email. Giả sử chúng ta đã có một danh sách các địa chỉ email có trong danh sách cho phép trong nút /whitelist/:

{
 "user": {
   "$uid": {
     "email": <email>
   }
 },
 "whitelist": {
   "fred@gmail%2Ecom": true,
   "barney@aol%2Ecom": true
 }
}

Chúng ta có thể tạo một quy tắc chỉ cho phép thêm người dùng nếu email của họ nằm trong nút /whitelist/:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "true",
        ".write": "root.child('whitelist').child(newData.child('email').val().replace('.', '%2E')).exists()"
      }
    }
  }
}

toBottomCase()

Trả về bản sao của chuỗi được chuyển đổi sang chữ thường.

Giá trị trả về: String – Chuỗi được chuyển đổi thành chữ thường.

Ví dụ này cho phép quyền đọc nếu auth.token.identifier vì mọi chữ thường đều tồn tại trong /users.

".read": "root.child('users').child(auth.token.identifier.toLowerCase()).exists()"

ToUpperCase()

Trả về bản sao của chuỗi được chuyển đổi sang chữ hoa.

Giá trị trả về: String – Chuỗi được chuyển đổi thành chữ hoa.

Ví dụ này cho phép truy cập đọc nếu auth.token.identifier vì tất cả chữ hoa đều tồn tại trong /users.

".read": "root.child('users').child(auth.token.identifier.toUpperCase()).exists()"

khớp(biểu thức chính quy)

Trả về true nếu chuỗi khớp với giá trị cố định trong biểu thức chính quy được chỉ định.

Giá trị trả về: Booleantrue nếu chuỗi khớp với giá trị cố định trong biểu thức chính quy; khác false.

Xem toàn bộ tài liệu về biểu thức chính quy về quy tắc.

Toán tử

+ (thêm)

Dùng để thêm biến hoặc để nối chuỗi.

Ví dụ sau đây đảm bảo rằng giá trị mới làm tăng giá trị hiện tại đúng một. Điều này rất hữu ích khi triển khai bộ đếm:

".write": "newData.val() === data.val() + 1"
".validate": "root.child('room_names/' + $room_id).exists()"

– (phủ định hoặc trừ)

Dùng để phủ định một giá trị hoặc trừ hai giá trị trong một biểu thức quy tắc.

Quy tắc xác thực này kiểm tra để đảm bảo rằng giá trị mới là giá trị nghịch đảo của giá trị con ở vị trí:

".validate": "newData.val() === -(data.child('quantity').val())"

Ví dụ sau đây sử dụng phép trừ để đảm bảo rằng chỉ có thể đọc các tin nhắn từ 10 phút trước:

".read": "newData.child('timestamp').val() > (now - 600000)"

* (nhân)

Dùng để nhân các biến trong một biểu thức quy tắc.

Quy tắc xác thực này sẽ kiểm tra xem giá trị mới có bằng với sản phẩm của giá và số lượng (hai giá trị hiện có):

".validate": "newData.val() === data.child('price').val() * data.child('quantity').val()"

/ (chia)

Dùng để chia các biến trong biểu thức quy tắc.

Trong ví dụ sau, quy tắc xác thực đảm bảo rằng dữ liệu được lưu trữ là giá trị trung bình của toàn bộ dữ liệu được lưu trữ ở những nơi khác:

".validate": "newData.val() === data.parent().child('sum').val() / data.parent().child('numItems').val()"

% (mô-đun)

Dùng để tìm số dư của phép chia một biến cho một biến khác trong một biểu thức quy tắc.

Quy tắc này xác thực rằng chỉ có thể viết số chẵn:

".validate": "newData.val() % 2 === 0"

= (bằng)

Dùng để kiểm tra xem hai biến trong biểu thức quy tắc có cùng loại và giá trị hay không.

Quy tắc sau đây sử dụng toán tử = để chỉ cấp quyền ghi cho chủ sở hữu tài khoản người dùng. UId của người dùng phải khớp chính xác với khoá ($user_id) để quy tắc được đánh giá là true.

"users": {
  ".write": "$user_id === auth.uid"
}

!== (không bằng)

Dùng để kiểm tra xem hai biến trong biểu thức quy tắc có không bằng nhau hay không.

Quy tắc đọc sau đây đảm bảo rằng chỉ người dùng đã đăng nhập mới có thể đọc dữ liệu:

".read": "auth !== null"

&& (VÀ)

Đánh giá là true nếu cả hai toán hạng đều đúng. Dùng để đánh giá nhiều điều kiện trong một biểu thức quy tắc.

Quy tắc xác thực sau đây sẽ kiểm tra để đảm bảo rằng dữ liệu mới là một chuỗi dưới 100 ký tự:

".validate": "newData.isString() && newData.val().length < 100"

|| (HOẶC)

Đánh giá là true nếu một toán hạng trong biểu thức quy tắc là true.

Trong ví dụ này, chúng ta có thể ghi miễn là dữ liệu cũ hoặc dữ liệu mới không tồn tại. Nói cách khác, chúng ta có thể ghi nếu chúng ta xoá hoặc tạo dữ liệu nhưng không cập nhật dữ liệu.

".write": "!data.exists() || !newData.exists()"

! (KHÔNG)

Đánh giá là true nếu một toán hạng của hàm đó là false. Trong biểu thức quy tắc, tham số ! toán tử thường được dùng để xem liệu dữ liệu đã được ghi vào một vị trí hay chưa.

Quy tắc sau chỉ cho phép quyền ghi nếu không có dữ liệu tại vị trí được chỉ định:

".write": "!data.exists()"

&gt; (lớn hơn)

Dùng để kiểm tra xem một giá trị có lớn hơn giá trị khác trong biểu thức quy tắc hay không.

Quy tắc xác thực này kiểm tra để đảm bảo chuỗi đang được ghi không phải là chuỗi trống:

".validate": "newData.isString() && newData.val().length > 0"

< (nhỏ hơn)

Dùng để kiểm tra xem một giá trị i có nhỏ hơn giá trị khác trong biểu thức quy tắc hay không.

Quy tắc xác thực này kiểm tra để đảm bảo rằng một chuỗi ít hơn 20 ký tự:

".validate": "newData.isString() && newData.val().length < 20"

>= (lớn hơn hoặc bằng)

Dùng để kiểm tra xem một giá trị lớn hơn hay bằng một giá trị khác trong biểu thức quy tắc.

Quy tắc xác thực này kiểm tra để đảm bảo chuỗi đang được ghi không phải là chuỗi trống:

".validate": "newData.isString() && newData.val().length >= 1"

<= (nhỏ hơn hoặc bằng)

Dùng để kiểm tra xem một giá trị có nhỏ hơn hay bằng một giá trị khác trong biểu thức quy tắc hay không.

Quy tắc xác thực này đảm bảo rằng bạn không thể thêm dữ liệu mới trong tương lai:

".validate": "newData.val() <= now"

không? (toán tử 3 ngôi)

Dùng để đánh giá biểu thức quy tắc có điều kiện.

Toán tử 3 ngôi sẽ nhận 3 toán hạng. Toán hạng trước ? là điều kiện. Nếu điều kiện này có giá trị true, thì toán hạng thứ hai sẽ được đánh giá. Nếu điều kiện này sai, thì toán hạng thứ ba sẽ được đánh giá.

Đối với quy tắc xác thực sau đây, giá trị mới có thể là số hoặc boolean. Nếu là số, giá trị này phải lớn hơn 0.

".validate": "newData.isNumber() ? newData.val() > 0 : newData.isBoolean()"