Tài liệu tham khảo về các quy tắc bảo mật của Firebase cho Cloud Storage

Firebase Security Rules cho Cloud Storage dùng để xác định ai có quyền đọc và ghi vào các tệp được lưu trữ trong Cloud Storage, cũng như cấu trúc của các tệp và siêu dữ liệu nào trong đó. Cloud Storage Security Rules bao gồm các quy tắc hãy xem xét requestresource để cho phép hoặc từ chối một hành động mong muốn, chẳng hạn như như tải lên một tệp hoặc truy xuất siêu dữ liệu của tệp. Đề cập đến các tài liệu tham khảo này các loại quy tắc, thuộc tính của requestresource, dữ liệu loại được sử dụng bởi Cloud Storage Security Rules và cách lỗi xảy ra.

Quy tắc

rule là một biểu thức được đánh giá để xác định xem request có phải là được phép thực hiện hành động mong muốn.

Loại

Cho phép

Các quy tắc allow bao gồm một phương thức, chẳng hạn như read hoặc write, cũng như một điều kiện không bắt buộc. Khi thực thi một quy tắc, điều kiện này sẽ được đánh giá và nếu điều kiện này được đánh giá là true, thì phương thức mong muốn sẽ được cho phép; nếu không thì phương thức bị từ chối. Quy tắc allow không có điều kiện nào luôn cho phép phương pháp mong muốn.

// Always allow method
allow <method>;

// Allow method if condition is true
allow <method>: if <condition>;

Hiện tại, allow là loại quy tắc duy nhất được hỗ trợ.

Phương thức yêu cầu

Đã đọc

Phương thức read áp dụng cho mọi yêu cầu đọc siêu dữ liệu hoặc dữ liệu tệp, bao gồm cả lượt tải tệp xuống và lượt đọc siêu dữ liệu tệp.

// Always allow reads
allow read;

// Allow reads if condition evaluates to true
allow read: if <condition>;

Viết

Phương thức write áp dụng cho mọi yêu cầu mà dữ liệu tệp hoặc siêu dữ liệu được ghi, bao gồm tải tệp lên, xoá tệp và cập nhật siêu dữ liệu tệp.

// Always allow writes
allow write;

// Allow writes if condition evaluates to true
allow write: if <condition>;

Đấu

Các quy tắc được thực thi khi người dùng request (chẳng hạn như tải tệp lên hoặc tải xuống) khớp với đường dẫn tệp có trong quy tắc. match bao gồm một đường dẫn và một phần nội dung. phải chứa ít nhất một quy tắc allow. Nếu không có đường dẫn nào phù hợp, thì yêu cầu bị từ chối.

Bạn có thể match một đường dẫn được đặt tên đầy đủ hoặc chèn ký tự đại diện để khớp với tất cả phù hợp với một mẫu nhất định.

Phân đoạn đường dẫn

single_segment

Bạn có thể sử dụng các phân đoạn đường dẫn đơn để tạo quy tắc khớp với tệp được lưu trữ trong Cloud Storage.

// Allow read at "path" if condition evaluates to true
match /path {
  allow read: if <condition>;
}

Bạn cũng có thể sử dụng nhiều phân đoạn đường dẫn và đường dẫn lồng nhau:

// Allow read at "path/to/object" if condition evaluates to true
match /path {
  match /to {
    match /object {
      allow read: if <condition>;
    }
  }
}

{single_segment_wildcard}

Nếu muốn áp dụng quy tắc cho nhiều tệp tại cùng một đường dẫn, bạn có thể sử dụng phân đoạn đường dẫn ký tự đại diện để khớp với tất cả các tệp ở một đường dẫn nhất định. Biến ký tự đại diện được khai báo trong một đường dẫn bằng cách gói một biến trong dấu ngoặc nhọn: {variable}. Bạn có thể truy cập biến này trong câu lệnh so khớp dưới dạng string.

// Allow read at any path "/*", if condition evaluates to true
match /{single_path} {
  // Matches "path", "to", or "object" but not "path/to/object"
  allow read: if <condition>;
}

Nhiều phân đoạn đường dẫn và đường dẫn lồng nhau cũng có thể có ký tự đại diện:

// Allow read at any path "/path/*/newPath/*", if condition evaluates to true
match /path/{first_wildcard} {
  match /newPath/{second_wildcard} {
    // Matches "path/to/newPath/newObject" or "path/from/newPath/oldObject"
    allow read: if <condition>;
  }
}

{multi_segment_wildcard=**}

Nếu muốn so khớp số lượng phân đoạn đường dẫn bất kỳ tại hoặc bên dưới một đường dẫn, bạn có thể sử dụng ký tự đại diện nhiều phân đoạn, sẽ khớp với tất cả các yêu cầu đến và bên dưới vị trí. Điều này có thể hữu ích cho việc cung cấp cho người dùng biểu mẫu tuỳ ý của riêng họ hoặc tạo các quy tắc phù hợp với nhiều phân đoạn đường dẫn khác nhau (chẳng hạn như như tạo một tập hợp các tệp có thể đọc công khai hoặc yêu cầu xác thực cho tất cả lượt ghi).

Đường dẫn ký tự đại diện nhiều phân đoạn được khai báo tương tự như một phân đoạn ký tự đại diện, có thêm =** ở cuối biến: {variable=**}. Biến ký tự đại diện nhiều phân đoạn có sẵn trong kết quả khớp câu lệnh dưới dạng đối tượng path.

// Allow read at any path "/**", if condition evaluates to true
match /{multi_path=**} {
  // Matches anything at or below this, from "path", "path/to", "path/to/object", ...
  allow read: if <condition>;
}

Yêu cầu

Biến request được cung cấp trong một điều kiện để biểu thị được thực hiện tại đường dẫn đó. Biến request có số lượng các thuộc tính có thể dùng để quyết định xem có cho phép yêu cầu đến hay không.

Thuộc tính

auth

Khi người dùng đã xác thực thực hiện một yêu cầu đối với Cloud Storage, biến auth được điền bằng uid (request.auth.uid) của người dùng là cũng như các tuyên bố của Firebase Authentication JWT (request.auth.token).

request.auth.token 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, request.auth.token cũng chứa mọi tuỳ chọn tuyên bố do nhà phát triển chỉ định.

Khi người dùng chưa được xác thực thực hiện một yêu cầu, request.auth sẽ được null.

// Allow requests from authenticated users
allow read, write: if request.auth != null;

path

Biến path chứa đường dẫn mà request đang được thực hiện chống lại.

// Allow a request if the first path segment equals "images"
allow read, write: if request.path[0] == 'images';

resource

Biến resource chứa siêu dữ liệu của một tệp đang được tải lên hoặc đã cập nhật siêu dữ liệu cho tệp hiện có. Điều này liên quan đến Biến resource chứa siêu dữ liệu tệp hiện tại tại đường dẫn được yêu cầu, chứ không phải siêu dữ liệu mới.

// Allow a request if the new value is smaller than 5MB
allow read, write: if request.resource.size < 5 * 1024 * 1024;

request.resource chứa các thuộc tính sau từ resource:

Tài sản
name
bucket
metadata
size
contentType

time

Biến time chứa dấu thời gian biểu thị thời gian hiện tại của máy chủ đang đánh giá một yêu cầu. Bạn có thể sử dụng tuỳ chọn này để cung cấp quyền truy cập theo thời gian đối với các tệp, chẳng hạn như: chỉ cho phép tải tệp lên cho đến một ngày nhất định, hoặc chỉ cho phép đọc tệp trong vòng một giờ sau khi tải lên.

// Allow a read if the file was created less than one hour ago
allow read: if request.time < resource.timeCreated + duration.value(1, 'h');

Nhiều hàm được cung cấp để ghi quy tắc bằng dấu thời gianthời lượng.

Tài nguyên

Biến resource chứa siêu dữ liệu tệp cho các tệp trong Cloud Storage, chẳng hạn như tên tệp, kích thước, thời gian tạo và siêu dữ liệu tuỳ chỉnh.

Thuộc tính

name

Một chuỗi chứa tên đầy đủ của tệp, bao gồm cả đường dẫn đến tệp.

// Allow reads if the resource name is "path/to/object"
allow read: if resource.name == 'path/to/object'

bucket

Một chuỗi chứa Google Cloud Storage bộ chứa chứa tệp này.

// Allow reads of all resources in your bucket
allow read: if resource.bucket == '<your-cloud-storage-bucket>'

generation

Một số nguyên chứa Google Cloud Storage tạo đối tượng của tệp. Dùng để tạo phiên bản đối tượng.

// Allow reads if the resource matches a known object version
allow read: if resource.generation == <known-generation>

metageneration

Một số nguyên chứa Google Cloud Storage tạo siêu đối tượng của tệp. Dùng để tạo phiên bản đối tượng.

// Allow reads if the resource matches a known object metadata version
allow read: if resource.metageneration == <known-generation>

size

Một số nguyên chứa kích thước tệp tính bằng byte.

// Allow reads if the resource is less than 10 MB
allow read: if resource.size < 10 * 1024 * 1024;

timeCreated

Dấu thời gian cho biết thời điểm tạo tệp.

// Allow reads if the resource was created less than an hour ago
allow read: if resource.timeCreated < request.time + duration.value(60, "m")

updated

Dấu thời gian cho biết thời điểm tệp được cập nhật lần gần đây nhất.

// Allow reads if the resource was updated less than an hour ago
allow read: if resource.updated < request.time + duration.value(60, "m")

md5Hash

Một chuỗi chứa hàm băm MD5 của .

// Allow writes if the hash of the uploaded file is the same as the existing file
allow write: if request.resource.md5Hash == resource.md5Hash;

crc32c

Một chuỗi chứa hàm băm crc32c của .

// Allow writes if the hash of the uploaded file is the same as the existing file
allow write: if request.resource.crc32c == resource.crc32c;

etag

Một chuỗi chứa etag của .

// Allow writes if the etag matches a known object etag
allow write: if resource.etag == <known-generation>

contentDisposition

Một chuỗi ký tự chứa cách sắp xếp nội dung của tệp.

// Allow reads if the content disposition matches a certain value
allow read: if resource.contentDisposition == 'inlined';

contentEncoding

Một chuỗi ký tự chứa mã hoá nội dung của tệp.

// Allow reads if the content is encoded with gzip
allow read: if resource.contentEncoding == 'gzip';

contentLanguage

Một chuỗi chứa ngôn ngữ nội dung của tệp.

// Allow reads if the content language is Japanese
allow read: if resource.contentLanguage == 'ja';

contentType

Một chuỗi chứa loại nội dung của tệp.

// Allow reads if the content type is PNG.
allow read: if resource.contentType == 'image/png';

metadata

Map<String, String> chứa siêu dữ liệu bổ sung do nhà phát triển cung cấp mới.

// Allow reads if a certain metadata field matches a desired value
allow read: if resource.metadata.customProperty == 'customValue';

Firestore.get và Firestore.exists

Các hàm firestore.get()firestore.exists() cho phép bạn truy cập tài liệu trong Cloud Firestore để đánh giá các tiêu chí ủy quyền phức tạp.

Cả hai hàm firestore.get()firestore.exists() đều dự kiến đường dẫn tài liệu được chỉ định đầy đủ. Khi sử dụng các biến để tạo đường dẫn cho firestore.get()firestore.exists(), bạn cần thoát một cách rõ ràng biến bằng cú pháp $(variable).

Firestore.get

Lấy nội dung của tài liệu Cloud Firestore.

service firebase.storage {
  match /b/{bucket}/o {
    match /users/{club}/files/{fileId} {
      allow read: if club in
        firestore.get(/databases/(default)/documents/users/$(request.auth.uid)).data.memberships
    }
  }
}

Firestore.exists

Kiểm tra xem tài liệu Cloud Firestore có tồn tại hay không.

service firebase.storage {
  match /b/{bucket}/o {
    match /users/{userId}/photos/{fileId} {
      allow read: if
        firestore.exists(/databases/(default)/documents/users/$(userId)/friends/$(request.auth.uid))
    }
  }
}

Dịch vụ

service là phần khai báo đầu tiên trong tệp Cloud Storage Security Rules và chỉ định dịch vụ nào áp dụng các quy tắc này.

Tên

name

Tên của quy tắc dịch vụ sẽ được áp dụng. Giá trị hiện tại duy nhất là firebase.storage.

// Specify the service name
service firebase.storage {
  match /b/{bucket}/o {
    ...
  }
}

Loại dữ liệu

Ngôn ngữ Rules cho phép bạn kiểm tra loại bằng toán tử is.

// For example
a is null
a is string

null

Loại dữ liệu null biểu thị một giá trị không tồn tại.

allow read: if request.auth != null;

bool

Loại bool đại diện cho giá trị boolean true hoặc false.

allow read: if true;   // always succeeds
allow write: if false; // always fails

So sánh

Bạn có thể so sánh các giá trị boolean bằng cách sử dụng toán tử == !=.

Toán tử boolean

Hoạt động Cụm từ
AND x && y
OR x || y
NOT !x

Tình trạng đoản mạch khi hoạt động và có thể trả về true, false hoặc một Lỗi.

allow read: if true || false;   // always succeeds, short circuits at true
allow write: if false && true; // always fails, short circuits at false

intfloat

Loại intfloat biểu thị số. Số nguyên là: 0, 1, -2, v.v. , trong khi số thực dấu phẩy động là: 1.0, -2.0, 3.33, v.v.

Số nguyên là giá trị 64 bit có dấu và số thực là giá trị tuân thủ IEEE 754 64 bit. Các giá trị thuộc loại int sẽ được chuyển đổi thành float khi dùng để so sánh và phép tính số học có giá trị float.

So sánh

Số nguyên và số thực có thể được so sánh và sắp xếp bằng cách sử dụng ==, !=, >, <, Các toán tử >=<=.

Số học

Số nguyên và số thực có thể được cộng, trừ, nhân, chia, mô-đun và bị phủ định:

Hoạt động Cụm từ
Bổ sung x + y
Trừ x - y
Phép nhân x * y
Bộ phận x / y
Mô-đun x % y
Dạng phủ định -x

Hàm toán học

Firebase Security Rules cho Cloud Storage cũng cung cấp một số trình trợ giúp toán học hàm để rút gọn biểu thức:

Chức năng Mô tả
math.ceil(x) Giá trị trần của giá trị số
math.floor(x) Tầng của giá trị số
math.round(x) Làm tròn giá trị nhập đến số nguyên gần nhất
math.abs(x) Giá trị tuyệt đối của dữ liệu đầu vào
math.isInfinite(x) Kiểm tra xem giá trị có phải là ±∞ hay không, trả về bool
math.isNaN(x) Kiểm tra xem giá trị có phải là số NaN hay không, trả về bool

string

So sánh

Có thể so sánh và sắp xếp theo ngữ pháp các chuỗi bằng cách sử dụng ==, !=, >, <, >=<=.

Phép nối

Bạn có thể nối các chuỗi bằng toán tử +.

// Concatenate a file name and extension
'file' + '.txt'

Chỉ mục và dải ô

Toán tử index string[] sẽ trả về một chuỗi có chứa ký tự đó tại chỉ mục được cung cấp trong chuỗi.

// Allow reads of files that begin with 'a'
match /{fileName} {
  allow read: if fileName[0] == 'a';
}

Toán tử range, string[i:j], trả về một chuỗi chứa ký tự giữa các chỉ mục được chỉ định, từ i (bao gồm) cho đến j (không bao gồm). Nếu bạn không chỉ định i hoặc j, thì giá trị mặc định sẽ là 0 và kích thước của chuỗi, tương ứng, nhưng ít nhất i hoặc j phải được chỉ định để dải ô hợp lệ.

// Allow reads of files that begin with 'abcdef'
match /{fileName} {
  allow read: if fileName[0:6] == 'abcdef';
}

Các toán tử indexrange sẽ báo lỗi nếu chỉ mục được cung cấp vượt quá giới hạn chuỗi.

size

Trả về số lượng ký tự trong chuỗi.

// Allow files with names less than 10 characters
match /{fileName} {
  allow write: if fileName.size() < 10;
}

matches

Thực hiện so khớp biểu thức chính quy, trả về true nếu chuỗi khớp với biểu thức chính quy nhất định. Công dụng Cú pháp RE2 của Google.

// Allow writes to files which end in ".txt"
match /{fileName} {
  allow write: if fileName.matches('.*\\.txt')
}

split

Phân tách một chuỗi theo một biểu thức chính quy đã cho và trả về list chuỗi. Sử dụng cú pháp RE2 của Google.

// Allow files named "file.*" to be uploaded
match /{fileName} {
  allow write: if fileName.split('.*\\..*')[0] == 'file'
}

path

Đường dẫn là tên giống thư mục có tính năng khớp mẫu không bắt buộc. Chiến lược phát hành đĩa đơn dấu gạch chéo lên / biểu thị điểm bắt đầu của một đoạn đường dẫn.

path

Chuyển đổi một đối số string thành path.

// Allow reads on a specific file path
match /{allFiles=**} {
  allow read: if allFiles == path('/path/to/file');
}

timestamp

Dấu thời gian tính theo giờ UTC, với các giá trị có thể bắt đầu từ 0001-01-01T00.00.00Z và kết thúc tại 9999-12-31T23.59.59Z.

So sánh

Bạn có thể so sánh và sắp xếp dấu thời gian bằng cách sử dụng ==, !=, >, <, >=<=.

Số học

Dấu thời gian hỗ trợ cộng và trừ giữa dấu thời gian và thời lượng dưới dạng sau:

Cụm từ Kết quả
timestamp + duration timestamp
duration + timestamp timestamp
timestamp - duration timestamp
timestamp - timestamp duration
duration + duration duration
duration - duration duration

date

Giá trị timestamp chỉ chứa year, monthday.

// Allow reads on the same day that the resource was created.
allow read: if request.time.date() == resource.timeCreated.date()

year

Giá trị năm dưới dạng số nguyên, từ 1 đến 9999.

// Allow reads on all requests made before 2017
allow read: if request.time.year() < 2017

month

Giá trị tháng dưới dạng số nguyên, từ 1 đến 12.

// Allow reads on all requests made during the month of January
allow read: if request.time.month() == 1;

day

Ngày hiện tại trong tháng dưới dạng số nguyên, từ 1 đến 31.

// Allow reads on all requests made during the first day of each month
allow read: if request.time.day() == 1;

time

Giá trị duration chứa thời gian hiện tại.

// Allow reads on all requests made before 12PM
allow read: if request.time.time() < duration.time(12, 0, 0, 0);

hours

Giá trị giờ dưới dạng số nguyên, từ 0 đến 23.

// Allow reads on all requests made before 12PM
allow read: if request.time.hours() < 12;

minutes

Giá trị phút dưới dạng số nguyên, từ 0 đến 59.

// Allow reads during even minutes of every hour
allow read: if request.time.minutes() % 2 == 0;

seconds

Giá trị giây dưới dạng số nguyên, từ 0 đến 59.

// Allow reads during the second half of each minute
allow read: if request.time.seconds() > 29;

nanos

Số giây phân số trong nano dưới dạng số nguyên.

// Allow reads during the first 0.1 seconds of each second
allow read: if request.time.nanos() < 100000000;

dayOfWeek

Ngày trong tuần, từ ngày 1 (thứ Hai) đến ngày 7 (Chủ Nhật).

// Allow reads on weekdays (Monday to Friday)
allow read: if request.time.dayOfWeek() < 6;

dayOfYear

Ngày của năm hiện tại, từ 1 đến 366.

// Allow reads every fourth day
allow read: if request.time.dayOfYear() % 4 == 0;

toMillis

Trả về số mili giây hiện tại kể từ thời gian bắt đầu của hệ thống Unix.

// Allow reads if the request is made before a specified time
allow read: if request.time.toMillis() < <milliseconds>;

duration

Giá trị thời lượng được biểu thị dưới dạng giây cộng với giây phân số theo nano giây.

So sánh

Bạn có thể so sánh và sắp xếp thời lượng bằng cách sử dụng ==, !=, >, <, >=<=.

Số học

Thời lượng hỗ trợ cộng và trừ giữa dấu thời gian và thời lượng dưới dạng sau:

Cụm từ Kết quả
timestamp + duration timestamp
duration + timestamp timestamp
timestamp - duration timestamp
timestamp - timestamp duration
duration + duration duration
duration - duration duration

seconds

Số giây trong thời lượng hiện tại. Phải nằm trong khoảng -315.576.000.000 và +315.576.000.000.

nanos

Số giây phân số (tính bằng nano giây) của thời lượng hiện tại. Phải beween -999.999.999 và +999.999.999. Đối với các giây khác 0 và khác 0 nano giây, thì dấu của cả hai phải phù hợp với nhau.

duration.value

Bạn có thể tạo thời lượng bằng duration.value(int magnitude, string units) , hàm này sẽ tạo ra khoảng thời gian từ độ lớn và đơn vị đã cho.

// All of these durations represent one hour:
duration.value(1, "h")
duration.value(60, "m")
duration.value(3600, "s")

Các unit có thể có là:

Thời lượng unit
Tuần w
Ngày d
Giờ h
Phút m
Giây s
Mili giây ms
Nano giây ns

duration.time

Bạn có thể tạo thời lượng bằng cách sử dụng Hàm duration.time(int hours, int minutes, int seconds, int nanoseconds), Định dạng này tạo ra một khoảng thời gian cho một số giờ, phút, giây và nano giây.

// Create a four hour, three minute, two second, one nanosecond duration
duration.time(4, 3, 2, 1)

list

Danh sách chứa một mảng giá trị được sắp xếp theo thứ tự, có thể thuộc loại: null, bool, int, float, string, path, list, map, timestamp hoặc duration.

Cho xy thuộc loại listij thuộc loại int

Tác phẩm sáng tạo

Để tạo danh sách, hãy thêm giá trị giữa các dấu ngoặc:

// Create a list of strings
['apples', 'grapes', 'bananas', 'cheese', 'goats']

So sánh

Bạn có thể so sánh các danh sách bằng toán tử == !=. Bằng nhau của hai danh sách yêu cầu mọi giá trị đều phải bằng nhau.

Chỉ mục và dải ô

Toán tử index, list[], trả về mục theo chỉ mục đã cho trong danh sách.

// Allow reads of all files that begin with 'a'
match /{fileName} {
  allow read: if fileName[0] == 'a';
}

Toán tử range, list[i:j], trả về tất cả các mục trong danh sách giữa chỉ mục được chỉ định, từ i (bao gồm) cho đến j (loại trừ). Nếu i hoặc j là không được chỉ định, chúng được đặt mặc định là 0 và kích thước của danh sách, nhưng ít nhất i hoặc j phải được chỉ định để dải ô hợp lệ.

// Allow reads of all files that begin with 'abcdef'
match /{fileName} {
  allow read: if fileName[0:6] == 'abcdef';
}

in

Trả về true nếu giá trị mong muốn có trong danh sách hoặc false nếu không có giá trị hiện tại.

// Allow read if a filename has the string 'txt' in it
match /{fileName} {
  allow read: if 'txt' in fileName.split('\\.');
}

join

Kết hợp danh sách các chuỗi thành một chuỗi duy nhất, phân tách bằng một chuỗi đã cho.

// Allow reads if the joined array is 'file.txt'
allow read: if ['file', 'txt'].join('.') == 'file.txt';

size

Số mục trong danh sách.

// Allow read if there are three items in our list
allow read: if ['foo', 'bar', 'baz'].size() == 3;

hasAll

Trả về true nếu tất cả giá trị đều có trong danh sách.

// Allow read if one list has all items in the other list
allow read: if ['file', 'txt'].hasAll(['file', 'txt']);

map

Một tệp ánh xạ chứa các cặp khoá/giá trị, trong đó khoá là chuỗi và giá trị có thể là bất kỳ trong số: null, bool, int, float, string, path, list, map, timestamp hoặc duration.

Tác phẩm sáng tạo

Để tạo tệp ánh xạ, hãy thêm cặp khoá/giá trị giữa các dấu ngoặc nhọn:

// Create a map of strings to strings
{
  'mercury': 'mars',
  'rain': 'cloud',
  'cats': 'dogs',
}

So sánh

Bạn có thể so sánh Maps bằng cách sử dụng toán tử == !=. Bằng nhau của hai bản đồ yêu cầu tất cả khoá có mặt trong cả hai bản đồ và tất cả các giá trị đều bằng nhau.

Chỉ mục

Giá trị trong bản đồ được truy cập bằng cách sử dụng ký hiệu dấu ngoặc hoặc dấu chấm:

// Access custom metadata properties
allow read: if resource.metadata.property == 'property'
allow write: if resource.metadata['otherProperty'] == 'otherProperty'

Nếu không có khoá, hàm sẽ trả về error.

in

Trả về true nếu khoá mong muốn có trong bản đồ hoặc false nếu không có hiện tại.

// Allow reads if a property is present in the custom metadata
allow read: if property in resource.metadata;

size

Số lượng khoá trong bản đồ.

// Allow reads if there's exactly one custom metadata key
allow read: if resource.metadata.size() == 1;

keys

Danh sách tất cả các khoá trong bản đồ.

// Allow reads if the first metadata key is 'myKey'
allow read: if resource.metadata.keys()[0] == 'myKey';

values

Danh sách tất cả các giá trị trong bản đồ, theo thứ tự khoá.

// Allow reads if the first metadata value is 'myValue'
allow read: if resource.metadata.values()[0] == 'myValue';

Lỗi

Đánh giá lỗi

Firebase Security Rules cho Cloud Storage sẽ tiếp tục đánh giá khi gặp lỗi. Điều này rất hữu ích vì biểu thức &&|| có điều kiện có thể hấp thụ lỗi nếu điều kiện làm ngắn mạch thành false hoặc true tương ứng. Ví dụ:

Cụm từ Kết quả
error && true error
error && false false
error || true true
error || false error

Các vị trí thường xảy ra lỗi là: chia cho 0, truy cập vào các giá trị trong danh sách hoặc bản đồ không tồn tại và chuyển các giá trị thuộc loại không chính xác vào một hàm.

// Error if resource.size is zero
allow read: if 1000000 / resource.size;

// Error, key doesn't exist
allow read: if resource.metadata.nonExistentKey == 'value';

// Error, no unit 'y' exists
allow read: if request.time < resource.timeCreated + duration.value(1, 'y');