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 request
và resource
để 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 request
và resource
, 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 gian và thờ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()
và 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()
và 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()
và 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
int
và float
Loại int
và float
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ử >=
và <=
.
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 ==
, !=
, >
, <
, >=
và
<=
.
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ử index
và range
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 ==
, !=
, >
, <
, >=
và
<=
.
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
, 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 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 ==
, !=
, >
, <
, >=
và
<=
.
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 x
và y
thuộc loại list
và i
và j
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 &&
và ||
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');