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 request
và resource
để 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 request
và resource
, 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.auth
là 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.
// 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 gian và khoả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()
và 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()
và 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()
và 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
int
và float
Kiểu int
và float
đạ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ử ==
, !=
, >
, <
, >=
và <=
.
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ử ==
, !=
, >
, <
, >=
và <=
.
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 index
và range
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ử ==
, !=
, >
, <
, >=
và <=
.
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
, month
và day
.
// 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ử ==
, !=
, >
, <
, >=
và <=
.
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 x
và y
thuộc loại list
và i
và j
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 &&
và ||
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');