Quy tắc bảo mật Firebase để tham khảo lưu trữ đám mây

Quy tắc bảo mật của Firebase cho Cloud Storage được sử dụng để xác định ai có quyền truy cập đọc và ghi vào các tệp được lưu trữ trong Cloud Storage, cũng như cách các tệp được cấu trúc và siêu dữ liệu trong đó chứa gì. Quy tắc bảo mật lưu trữ đám mây bao gồm các quy tắc 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ư tải tệp lên hoặc truy xuất siêu dữ liệu tệp. Các tài liệu tham khảo này bao gồm các loại quy tắc, thuộc tính của requestresource , các loại dữ liệu được Quy tắc bảo mật lưu trữ đám mây sử dụng và cách xảy ra lỗi.

Luật lệ

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

Các loại

Cho phép

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 tùy chọn. Khi một quy tắc được thực thi, điều kiện sẽ được đánh giá và nếu điều kiện được đánh giá là true thì phương thức mong muốn sẽ được cho phép; nếu không, phương pháp này bị từ chối. Quy tắc allow không có điều kiện luôn cho phép phương thức 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 được hỗ trợ duy nhất.

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

Đọc

Phương thức read bao gồm tất cả các yêu cầu đọc dữ liệu tệp hoặc siêu dữ liệu, bao gồm tải xuống tệp và đọ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 bao gồm tất cả các yêu cầu ghi dữ liệu tệp hoặc siêu dữ liệu, bao gồm tải tệp lên, xóa 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>;

Cuộc thi đấu

Các quy tắc được thực thi khi request của người dùng (chẳng hạn như tải lên hoặc tải xuống tệp) khớp với đường dẫn tệp nằm trong quy tắc. Một 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, yêu cầu sẽ bị từ chối.

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

Đ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>;
}

Nhiều đoạn đường dẫn và đường dẫn lồng nhau cũng được cho phép:

// 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 bạn muốn áp dụng quy tắc cho nhiều tệp trên 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 tất cả các tệp tại một đường dẫn nhất định. Biến ký tự đại diện được khai báo trong đường dẫn bằng cách gói biến trong dấu ngoặc nhọn: {variable} . Biến này có thể truy cập được trong câu lệnh match dưới dạng một 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 đ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 bạn muốn khớp bất kỳ số lượng phân đoạn đường dẫn nào 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, ký tự này sẽ khớp 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 khi cung cấp cho người dùng không gian lưu trữ dạng tự do của riêng họ hoặc tạo quy tắc khớp với nhiều phân đoạn đường dẫn khác nhau (chẳng hạn như tạo một tập hợp tệp có thể đọc công khai hoặc yêu cầu xác thực cho tất cả các lần ghi).

Đường dẫn ký tự đại diện nhiều phân đoạn được khai báo tương tự như ký tự đại diện một phân đoạn, với việc thêm =** vào cuối biến: {variable=**} . Biến ký tự đại diện nhiều phân đoạn có sẵn trong câu lệnh so khớp 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>;
}

Lời yêu cầu

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

Của cải

auth

Khi người dùng được xác thực thực hiện yêu cầu đối với Cloud Storage, biến auth sẽ được điền bằng uid của người dùng ( request.auth.uid ) cũng như các xác nhận quyền sở hữu của JWT xác thực Firebase ( request.auth.token ).

request.auth.token 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, request.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.

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

// 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.

// 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 tệp đang được tải lên hoặc siêu dữ liệu được cập nhật 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 ở đường dẫn được yêu cầu, trái ngược vớ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 máy chủ hiện tại mà yêu cầu đang được đánh giá. Bạn có thể sử dụng quyền này để cung cấp quyền truy cập theo thời gian vào 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 tối đa một giờ sau khi chúng được 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 để viết quy tắc sử dụng dấu thời giankhoảng thời gian .

Nguồ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 tùy chỉnh.

Của cải

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 nhóm Google Cloud Storage mà tệp này được lưu trữ.

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

generation

Một int chứa tệp tạo đối tượng Google Cloud Storage. Được sử dụng để 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 int chứa siêu tạo đối tượng Google Cloud Storage của tệp. Được sử dụng để 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 int 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 biểu thị thời điểm tệp được tạo.

// 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 biểu thị thời điểm tệp được cập nhật lần cuối.

// 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 tệp.

// 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 tệp.

// 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 tập tin.

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

contentDisposition

Một chuỗi 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 chứa mã hóa 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 tin.

// 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 các trường siêu dữ liệu bổ sung do nhà phát triển cung cấp.

// 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 các 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 mong đợi các đường dẫn tài liệu được chỉ định đầy đủ. Khi sử dụng các biến để xây dựng đường dẫn cho firestore.get()firestore.exists() , bạn cần thoát khỏi các biến một cách rõ ràng bằng cú pháp $(variable) .

firestore.get

Nhận 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 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 này là phần khai báo đầu tiên trong tệp Quy tắc bảo mật lưu trữ đám mây và chỉ định dịch vụ nào các quy tắc này sẽ áp dụng.

Tên

name

Tên của các 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ữ Quy tắc 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

Kiểu dữ liệu null đại diện cho một giá trị không tồn tại.

allow read: if request.auth != null;

bool

Kiểu 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

Các giá trị Boolean có thể được so sánh bằng cách sử dụng toán tử == != .

Các phép toán Boolean

Hoạt động Sự biểu lộ
AND x && y
OR x || y
NOT !x

Hoạt động bị đoản mạch và có thể trả về true , false hoặc Error .

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

intfloat

Kiểu intfloat đại diện cho số. Số nguyên là: 0 , 1 , -2 , v.v., trong khi số float là: 1.0 , -2.0 , 3.33 , v.v.

Int là các giá trị 64 bit được ký và float là các giá trị tuân thủ IEEE 754 64 bit. Các giá trị của kiểu int sẽ bị buộc phải float khi được sử dụng trong các phép so sánh và phép tính số học có giá trị float .

So sánh

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

Môn số học

Int và float có thể được cộng, trừ, nhân, chia, điều biến và phủ định:

Hoạt động Sự biểu lộ
Phép cộng x + y
Phép trừ x - y
Phép nhân x * y
Phân công x / y
Modulo x % y
phủ định -x

hàm toán học

Quy tắc bảo mật Firebase dành cho lưu trữ đám mây cũng cung cấp một số hàm trợ giúp toán học để đơn giản hóa các biểu thức:

Chức năng Sự miêu tả
math.ceil(x) 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ị đầu vào đến số nguyên gần nhất
math.abs(x) Giá trị tuyệt đối của đầ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ác chuỗi có thể được so sánh và sắp xếp theo từ điển bằng cách sử dụng các toán tử == , != , > , < , >=<= .

Nối

Các chuỗi có thể được nối bằng toán tử + .

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

Chỉ số và phạm vi

Toán tử index , string[] , trả về một chuỗi 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 các ký tự giữa các chỉ mục đã chỉ định, từ i (bao gồm) cho đến j (độc quyền). Nếu i hoặc j không được chỉ định, chúng mặc định 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 để phạm vi hợp lệ.

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

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

size

Trả về số 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 đã cho. Sử dụng cú pháp Google RE2 .

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

split

Tách một chuỗi theo biểu thức chính quy được cung cấp và trả về list các chuỗi. Sử dụng cú pháp Google RE2 .

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

path

Đường dẫn là các tên giống như thư mục với mẫu khớp tùy chọn. Sự hiện diện của dấu gạch chéo lên / biểu thị sự bắt đầu của một đoạn đường dẫn.

path

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

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

timestamp

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

So sánh

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

Môn số học

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

Sự biểu lộ 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 int, 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ạng int, 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 của tháng dưới dạng int, 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 int, 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 int, 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 int, từ 0 đến 59.

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

nanos

Phân số giây tính bằng nano dưới dạng int.

// 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ừ 1 (Thứ Hai) đến 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ừ kỷ nguyên 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 phân số giây tính bằng nano giây.

So sánh

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

Môn 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 như sau:

Sự biểu lộ 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 khoảng thời gian hiện tại. Phải nằm trong khoảng từ -315.576.000.000 đến +315.576.000.000.

nanos

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

duration.value

Khoảng thời gian có thể được tạo bằng cách sử dụng hàm duration.value(int magnitude, string units) , tạo ra khoảng thời gian từ cường độ và đơn vị nhất định.

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

unit có thể có là:

Khoảng thời gian 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

Có thể tạo khoảng thời gian bằng cách sử dụng duration.time(int hours, int minutes, int seconds, int nanoseconds) , hàm này tạo ra khoảng thời gian của các giờ, phút, giây và nano giây nhất định.

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

list

Một danh sách chứa một mảng các giá trị được sắp xếp, 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

Sự sáng tạo

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

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

So sánh

Danh sách có thể được so sánh bằng cách sử dụng toán tử == != . Sự bình đẳng của hai danh sách yêu cầu tất cả các giá trị phải bằng nhau.

Chỉ số và phạm vi

Toán tử index list[] , trả về mục tại chỉ mục được cung cấp 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 các chỉ mục được chỉ định, từ i (bao gồm) cho đến j (độc quyền). Nếu i hoặc j không được chỉ định, chúng mặc định là 0 và kích thước của danh sách tương ứng, nhưng ít nhất i hoặc j phải được chỉ định để phạm vi 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 trả về false nếu không có.

// 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, cách nhau bằng chuỗi đã cho.

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

size

Số lượng 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ả cá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

Bản đồ chứa các cặp khóa/giá trị, trong đó khóa là chuỗi và giá trị có thể là bất kỳ giá trị nào trong số: null , bool , int , float , string , path , list , map , timestamp hoặc duration .

Sự sáng tạo

Để tạo bản đồ, hãy thêm các cặp khóa/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ể được so sánh bằng cách sử dụng toán tử == != . Sự bình đẳng của hai bản đồ yêu cầu tất cả các khóa đều có trong cả hai bản đồ và tất cả các giá trị đều bằng nhau.

Mục lục

Cá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ó khóa, error sẽ được trả về.

in

Trả về true nếu khóa mong muốn có trong bản đồ hoặc trả về false nếu không có.

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

size

Số lượng phím trên 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 phím 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ự chính.

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

Lỗi

Đánh giá lỗi

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

Sự biểu lộ Kết quả
error && true error
error && false false
error || true true
error || false error

Các trường hợp thường xảy ra lỗi là: chia cho 0, truy cập 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 cho 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');