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

Quy tắc: Các loại

.đọc

Cấp cho khách hàng quyền truy cập đọc vào vị trí Cơ sở dữ liệu 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 khách hàng quyền truy cập đọc vào vị trí Cơ sở dữ liệu thời gian thực Firebase. Ví dụ:

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

Giá trị của quy tắc .read là một chuỗi, được đánh giá dưới dạng tập hợp con cú pháp biểu thức của JavaScript với một vài thay đổi về hành vi để tăng tính 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 bất kỳ hậu duệ nào của vị trí đó, ngay cả khi các hậu duệ có quy tắc .read riêng của chúng không thành công.

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 thời gian thực Firebase ngoại trừ newData .

.viết

Cấp cho khách hàng quyền ghi vào vị trí Cơ sở dữ liệu 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 khách hàng quyền truy cập ghi vào vị trí Cơ sở dữ liệu thời gian thực Firebase. Ví dụ:

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

Giá trị của quy tắc .write là một chuỗi, được đánh giá dưới dạng tập hợp con cú pháp biểu thức của JavaScript 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 vào một vị trí cũng sẽ cho phép ghi vào bất kỳ hậu duệ nào của vị trí đó, ngay cả khi hậu duệ có quy tắc .write riêng của chú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 thời gian thực Firebase.

.xác nhận

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

Quy tắc .validate được sử dụng sau khi quy tắc .write đã cấp quyền truy cập để đảm bảo rằng dữ liệu được ghi tuân thủ một tiêu chuẩn cụ thể. Ngoài việc cấp quyền truy cập .write , tất cả các quy tắc .validate có liên quan 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, được đánh giá dưới dạng tập hợp con cú pháp biểu thức của JavaScript với một vài thay đổi về hành vi để tăng tính 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 thời gian thực Firebase.

.indexBật

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

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

{
  "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ề 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 khách được xác thực hoặc null nếu ứng dụng khách không được xác thực.

Cơ sở dữ liệu thời gian thực Firebase cho phép bạn dễ dàng xác thực với một số nhà cung cấp tích hợp 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, biến xác thực sẽ chứa thông tin sau:

Cánh đồng Sự miêu tả
provider Phương thức xác thực được sử dụng (ví dụ: "mật khẩu", "ẩn danh", "facebook", "github", "google" hoặc "twitter").
uid Id người dùng duy nhất, được đả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 ID xác thực Firebase. 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 nhận xét miễn là họ lưu trữ ID người dùng của họ cùng với nhận xét đó:

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

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

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

xác thực.token

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

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

Cánh đồng Sự miêu 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 đặt.
sub UID Firebase của người dùng. Đây là điều duy nhất trong một dự án.
firebase.identities Từ điển của tất cả các danh tính được liên kết với tài khoản của người dùng này. Các khóa của từ điển có thể là bất kỳ khóa nào sau đây: email , phone , google.com , facebook.com , github.com , twitter.com . Các giá trị của từ điển là các mảng mã định danh duy nhất cho mỗi 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 ID 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 được sử dụng để nhận 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 ID đối tượng thuê được liên kết với tài khoản, nếu có. ví dụ: tenant2-m6tyz

Nếu sử dụng xác thực tùy chỉnh, auth.token cũng chứa bất kỳ xác nhận quyền sở hữu tùy chỉnh nào do nhà phát triển chỉ định.

Tất cả các giá trị này có thể được sử dụng trong các 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 tôi 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 thiện, các trường sau cũng được bao gồm trong auth.token nhưng chúng dường như không hữu ích cho các quy tắc.

Cánh đồng Sự miêu tả
iss Người phát hành token.
aud Khán giả cho mã thông báo.
auth_time Lần cuối cùng người dùng xác thực bằng 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 token được phát hành.
exp Thời điểm token hết hạn.

vị trí $

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

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

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

Khi khách hàng cố gắng truy cập /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' . Kết quả là, việc đọc /users/barney sẽ chỉ thành công nếu ứng dụng khách được xác thực bằng uid là "barney".

Hiện nay

Chứa số mili giây kể từ kỷ nguyên 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ừ kỷ nguyên UNIX theo máy chủ Cơ sở dữ liệu thời gian thực Firebase. Ví dụ: bạn có thể sử dụng điều này để xác thực rằng thời gian do người dùng created không bao giờ được đặt thành thời gian trong tương lai:

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

nguồn gốc

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

Biến gốc cung cấp cho bạn RuleDataSnapshot tương ứng với dữ liệu hiện tại ở thư mục gốc của Cơ sở dữ liệu thời gian thực Firebase của bạn. Bạn có thể sử dụng điều này để đọc bất kỳ dữ liệu nào trong cơ sở dữ liệu trong biểu thức quy tắc của bạn. Ví dụ: nếu chúng tôi muốn cho phép người dùng đọc /comments chỉ khi /users/<id>/active của họ được đặt thành true, chúng tôi 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 được xác thực bằng uid là "barney" có thể ghi vào nút /comments .

dữ liệu

RuleDataSnapshot tương ứng với dữ liệu hiện tại trong Cơ sở dữ liệu thời gian thực Firebase tại vị trí của quy tắc hiện đ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 trong vị trí cơ sở dữ liệu của quy tắc hiện đang thực thi (ngược lại với quy tắc gốc, quy tắc này cung cấp cho bạn dữ liệu cho thư mục gốc của cơ sở dữ liệu của bạn).

Vì vậy, ví dụ: nếu bạn muốn cho phép bất kỳ khách hàng nào truy cập /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 các quy tắc .read , .write.validate .

dữ liệu mới

RuleDataSnapshot tương ứng với dữ liệu sẽ có nếu cho phép ghi.

Đối với các quy tắc .write.validate , biến newData cung cấp cho bạn một RuleDataSnapshot tương ứng với dữ liệu sẽ có nếu việc ghi được cho phép (đó là sự "hợp nhất" dữ liệu hiện có cộng với 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 nó hoạt động đúng ngay cả đối với các cập nhật "một phần". 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 quy tắc .read vì không có dữ liệu mới nào được ghi. Bạn chỉ nên sử dụng dữ liệu .

RuleDataSnapshot: Phương thức

val()

Lấy giá trị nguyên thủy ( string , number , boolean hoặc null ) từ RuleDataSnapshot này.

Giá trị trả về : ( String , Number , Boolean , Null ) - Giá trị nguyên thủy từ 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ề một đối tượng chứa các con đó. Thay vào đó nó sẽ trả về một giá trị canh gác đặ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 các 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 phần tử con isReadable được đặt thành true tại vị trí đang được đọc.

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

đứa trẻ()

Nhận RuleDataSnapshot cho vị trí tại đường dẫn tương đối đã chỉ định.

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

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

Đường dẫn tương đối có thể là 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 phần tử con isReadable được đặt thành true tại vị trí đang được đọc.

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

cha mẹ()

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

Giá trị trả về : RuleDataSnapshot - RuleDataSnapshot cho vị trí chính.

Nếu phiên bản này đề cập đến thư mục gốc của Cơ sở dữ liệu thời gian thực Firebase của bạn thì phiên bản đó không có cấp độ 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 lỗi).

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

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

hasChild(childPath)

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

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

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

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

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

hasChildren([trẻ em])

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

Đối số : Array children tùy chọn - Một mảng các khóa con phải tồn tại.

Giá trị trả về : Boolean - true 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, nó 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 con được cung cấp, nó sẽ chỉ trả về true nếu tất cả tên con được chỉ định tồn tại trong RuleDataSnapshot .

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

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

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

".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ề : Boolean - true nếu RuleDataSnapshot chứa bất kỳ dữ liệu nào; khác false .

Hàm tồn tại trả về true nếu RuleDataSnapshot này chứa bất kỳ dữ liệu nào. Nó hoàn toàn là một chức năng 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à không có dữ liệu hiện có.

".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 đượ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ề : Boolean - true nếu dữ liệu là số; khác false .

Ví dụ này đảm bảo rằng dữ liệu mới được ghi có "tuổi" con với 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ề : Boolean - true nếu dữ liệu là String ; khác false .

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

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

isBoolean()

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

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

Ví dụ này đảm bảo rằng dữ liệu mới được ghi có con "hoạt động" với 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ề : Boolean - true 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 chứa "@".

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

bắt đầuVới(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ề : Boolean - true nếu chuỗi chứa chuỗi con đã chỉ định; khác false .

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

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

kết thúcWith(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ề : Boolean - true 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 truy cập đọ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 với tất cả các phiên bản của chuỗi con đã chỉ định được thay thế bằng chuỗi thay thế đã 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() hơi khác so với phương thức replace() của JavaScript ở chỗ nó thay thế tất cả các phiên bản của một chuỗi con được chỉ định bằng chuỗi thay thế đã chỉ định, không chỉ phiên bản đầu tiên.

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

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

Chúng tôi có thể tạo 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()"
      }
    }
  }
}

toLowerCase()

Trả về bản sao của chuỗi được chuyển đổi thành 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 truy cập đọc nếu auth.token.identifier vì tất cả chữ thường đều tồn tại trong /users .

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

Đến trường hợp trên()

Trả về bản sao của chuỗi được chuyển đổi thành 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()"

trận đấu (regex)

Trả về true nếu chuỗi khớp với ký tự biểu thức chính quy đã chỉ định.

Giá trị trả về : Boolean - true nếu chuỗi khớp với biểu thức chính quy, biểu thức chính quy; khác false .

Xem tài liệu quy tắc đầy đủ về biểu thức chính quy .

Toán tử

+ (thêm)

Được sử dụng để thêm các biến hoặc để nối chuỗi.

Ví dụ sau đây đảm bảo rằng giá trị mới tăng giá trị hiện có chính xác một. Điều này rất hữu ích cho việc thực hiện một bộ đếm:

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

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

Được sử dụng để phủ định một giá trị hoặc trừ hai giá trị trong biểu thức quy tắc.

Quy tắc xác thực này kiểm tra xem giá trị mới có phải là nghịch đảo của giá trị con tại vị trí không:

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

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

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

* (nhân)

Được sử 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 kiểm tra xem giá trị mới có bằng sản phẩm giá và số lượng hay không (hai giá trị hiện có):

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

/ (chia)

Được sử dụng để chia các biến trong một 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à mức trung bình của tổng dữ liệu được lưu trữ ở nơi khác:

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

% (mô đun)

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

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

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

=== (bằng)

Được sử 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 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 khóa ( $user_id ) để quy tắc đánh giá là đúng.

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

!== (không bằng)

Được sử dụng để kiểm tra xem hai biến trong biểu thức quy tắc có 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. Được sử 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 xem dữ liệu mới có phải là một chuỗi nhỏ hơn 100 ký tự hay không:

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

|| (HOẶC)

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

Trong ví dụ này, chúng ta có thể viết 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ể viết nếu chúng ta đang xóa 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)

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

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

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

> (lớn hơn)

Được sử 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 xem chuỗi đang được viết không phải là chuỗi trống:

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

< (ít hơn)

Được sử dụng để kiểm tra xem một giá trị 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 xem một chuỗi có nhỏ hơn 20 ký tự hay không:

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

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

Được sử dụng để kiểm tra xem một giá trị có lớn hơn hoặc bằng 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 xem chuỗi đang được viết không phải là chuỗi trống:

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

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

Được sử dụng để kiểm tra xem một giá trị có nhỏ hơn hoặc bằng 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 dữ liệu mới không thể được thêm vào trong tương lai:

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

? (toán tử bậc ba)

Được sử dụng để đánh giá một biểu thức quy tắc có điều kiện.

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

Đố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ố thì phải lớn hơn 0.

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