Hướng dẫn này được xây dựng dựa trên việc tìm hiểu cú pháp cốt lõi của hướng dẫn ngôn ngữ Quy tắc bảo mật Firebase để chỉ ra cách thêm các điều kiện vào Quy tắc bảo mật Firebase cho Lưu trữ đám mây của bạn.
Khối xây dựng chính của Quy tắc bảo mật lưu trữ đám mây là điều kiện . Điều kiện là một biểu thức boolean xác định xem một hoạt động cụ thể nên được phép hay bị từ chối. Đối với các quy tắc cơ bản, việc sử dụng các từ true
và false
làm điều kiện hoàn toàn hoạt động tốt. Tuy nhiên, Quy tắc bảo mật của Firebase cho ngôn ngữ Lưu trữ đám mây cung cấp cho bạn các cách để viết các điều kiện phức tạp hơn có thể:
- Kiểm tra xác thực người dùng
- Xác thực dữ liệu đến
Xác thực
Quy tắc bảo mật của Firebase cho Lưu trữ đám mây tích hợp với Xác thực Firebase để cung cấp xác thực dựa trên người dùng mạnh mẽ cho Lưu trữ đám mây. Điều này cho phép kiểm soát truy cập chi tiết dựa trên yêu cầu của mã thông báo Xác thực Firebase.
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 request.auth
được điền vào uid
của người dùng ( request.auth.uid
) cũng như các yêu cầu của JWT Xác thực Firebase ( request.auth.token
).
Ngoài ra, khi sử dụng xác thực tùy chỉnh, các xác nhận quyền sở hữu bổ sung sẽ xuất hiện trong trường request.auth.token
.
Khi người dùng chưa được xác thực thực hiện một yêu cầu, biến request.auth
là null
.
Sử dụng dữ liệu này, có một số cách phổ biến để sử dụng xác thực để bảo mật tệp:
- Công khai: bỏ qua
request.auth
- Riêng tư đã được xác thực: kiểm tra xem
request.auth
không phải lànull
- Người dùng riêng tư: kiểm tra xem
request.auth.uid
có bằnguid
đường dẫn không - Nhóm riêng tư: kiểm tra xác nhận quyền sở hữu của mã thông báo tùy chỉnh để khớp với xác nhận quyền sở hữu đã chọn hoặc đọc siêu dữ liệu tệp để xem liệu trường siêu dữ liệu có tồn tại hay không
Công cộng
Bất kỳ quy tắc nào không xem xét ngữ cảnh request.auth
đều có thể được coi là quy tắc public
, vì nó không xem xét ngữ cảnh xác thực của người dùng. Các quy tắc này có thể hữu ích để hiển thị dữ liệu công khai như nội dung trò chơi, tệp âm thanh hoặc nội dung tĩnh khác.
// Anyone to read a public image if the file is less than 100kB // Anyone can upload a public file ending in '.txt' match /public/{imageId} { allow read: if resource.size < 100 * 1024; allow write: if imageId.matches(".*\\.txt"); }
Đã xác thực riêng tư
Trong một số trường hợp nhất định, bạn có thể muốn tất cả người dùng đã xác thực ứng dụng của mình có thể xem được dữ liệu, nhưng không phải bởi những người dùng chưa được xác thực. Vì biến request.auth
là null
đối với tất cả người dùng chưa được xác thực, tất cả những gì bạn phải làm là kiểm tra biến request.auth
tồn tại để yêu cầu xác thực:
// Require authentication on all internal image reads match /internal/{imageId} { allow read: if request.auth != null; }
Người dùng riêng tư
Cho đến nay, trường hợp sử dụng phổ biến nhất cho request.auth
sẽ là cung cấp cho người dùng cá nhân các quyền chi tiết đối với tệp của họ: từ tải ảnh hồ sơ lên đến đọc tài liệu riêng tư.
Vì các tệp trong Bộ nhớ đám mây có "đường dẫn" đầy đủ đến tệp, tất cả những gì cần thiết để tạo tệp do người dùng kiểm soát là một phần thông tin nhận dạng người dùng duy nhất trong tiền tố tên tệp (chẳng hạn như uid
của người dùng) có thể được kiểm tra khi quy tắc được đánh giá:
// Only a user can upload their profile picture, but anyone can view it match /users/{userId}/profilePicture.png { allow read; allow write: if request.auth.uid == userId; }
Nhóm riêng tư
Một trường hợp sử dụng phổ biến không kém khác sẽ là cho phép nhóm quyền trên một đối tượng, chẳng hạn như cho phép một số thành viên trong nhóm cộng tác trên một tài liệu được chia sẻ. Có một số cách tiếp cận để thực hiện điều này:
- Đúc kết mã thông báo tùy chỉnh Xác thực Firebase chứa thông tin bổ sung về thành viên nhóm (chẳng hạn như ID nhóm)
- Bao gồm thông tin nhóm (chẳng hạn như ID nhóm hoặc danh sách các
uid
được ủy quyền) trong siêu dữ liệu tệp
Khi dữ liệu này được lưu trữ trong mã thông báo hoặc siêu dữ liệu tệp, nó có thể được tham chiếu từ bên trong một quy tắc:
// Allow reads if the group ID in your token matches the file metadata's `owner` property // Allow writes if the group ID is in the user's custom token match /files/{groupId}/{fileName} { allow read: if resource.metadata.owner == request.auth.token.groupId; allow write: if request.auth.token.groupId == groupId; }
Yêu cầu đánh giá
Tải lên, tải xuống, thay đổi siêu dữ liệu và xóa được đánh giá bằng cách sử dụng request
được gửi tới Cloud Storage. Ngoài ID duy nhất của người dùng và trọng tải Xác thực Firebase trong đối tượng request.auth
như được mô tả ở trên, biến request
chứa đường dẫn tệp nơi yêu cầu đang được thực hiện, thời điểm nhận được yêu cầu và giá trị resource
mới nếu yêu cầu là một bản viết. Tiêu đề HTTP và trạng thái xác thực cũng được bao gồm.
Đối tượng request
cũng chứa ID duy nhất của người dùng và trọng tải Xác thực Firebase trong đối tượng request.auth
, sẽ được giải thích thêm trong phần Bảo mật dựa trên người dùng của tài liệu.
Dưới đây là danh sách đầy đủ các thuộc tính trong đối tượng request
:
Tài sản | Loại hình | Sự mô tả |
---|---|---|
auth | map <string, string> | Khi người dùng đăng nhập, hãy cung cấp uid , ID duy nhất của người dùng và token , bản đồ xác thực Firebase JWT tuyên bố. Nếu không, nó sẽ là null . |
params | map <string, string> | Bản đồ chứa các tham số truy vấn của yêu cầu. |
path | đường dẫn | Một path đại diện cho đường dẫn mà yêu cầu đang được thực hiện. |
resource | map <string, string> | Giá trị tài nguyên mới, chỉ hiển thị khi yêu cầu write . |
time | dấu thời gian | Dấu thời gian đại diện cho thời gian máy chủ mà yêu cầu được đánh giá tại. |
Đánh giá nguồn lực
Khi đánh giá các quy tắc, bạn cũng có thể muốn đánh giá siêu dữ liệu của tệp đang được tải lên, tải xuống, sửa đổi hoặc xóa. Điều này cho phép bạn tạo các quy tắc phức tạp và mạnh mẽ để thực hiện những việc như chỉ cho phép các tệp có loại nội dung nhất định được tải lên hoặc chỉ các tệp lớn hơn một kích thước nhất định mới bị xóa.
Quy tắc bảo mật của Firebase cho Lưu trữ đám mây cung cấp siêu dữ liệu tệp trong đối tượng resource
, chứa các cặp khóa / giá trị của siêu dữ liệu hiển thị trong đối tượng Lưu trữ đám mây. Các thuộc tính này có thể được kiểm tra trên các yêu cầu read
hoặc write
để đảm bảo tính toàn vẹn của dữ liệu.
Khi yêu cầu write
(chẳng hạn như tải lên, cập nhật siêu dữ liệu và xóa), ngoài đối tượng resource
, chứa siêu dữ liệu tệp cho tệp hiện đang tồn tại ở đường dẫn yêu cầu, bạn cũng có thể sử dụng đối tượng request.resource
, trong đó chứa một tập hợp con của siêu dữ liệu tệp sẽ được ghi nếu việc ghi được cho phép. Bạn có thể sử dụng hai giá trị này để đảm bảo tính toàn vẹn của dữ liệu hoặc thực thi các ràng buộc ứng dụng như loại hoặc kích thước tệp.
Dưới đây là danh sách đầy đủ các thuộc tính trong đối tượng resource
:
Tài sản | Loại hình | Sự mô tả |
---|---|---|
name | sợi dây | Tên đầy đủ của đối tượng |
bucket | sợi dây | Tên của thùng chứa đối tượng này. |
generation | int | Việc tạo đối tượng Google Cloud Storage của đối tượng này. |
metageneration | int | Việc kiểm soát đối tượng Google Cloud Storage của đối tượng này. |
size | int | Kích thước của đối tượng tính bằng byte. |
timeCreated | dấu thời gian | Dấu thời gian biểu thị thời gian một đối tượng được tạo. |
updated | dấu thời gian | Dấu thời gian đại diện cho thời gian một đối tượng được cập nhật lần cuối. |
md5Hash | sợi dây | Một băm MD5 của đối tượng. |
crc32c | sợi dây | Một hàm băm crc32c của đối tượng. |
etag | sợi dây | Etag liên kết với đối tượng này. |
contentDisposition | sợi dây | Sự bố trí nội dung liên quan đến đối tượng này. |
contentEncoding | sợi dây | Mã hóa nội dung được liên kết với đối tượng này. |
contentLanguage | sợi dây | Ngôn ngữ nội dung được liên kết với đối tượng này. |
contentType | sợi dây | Loại nội dung được liên kết với đối tượng này. |
metadata | map <string, string> | Các cặp khóa / giá trị của siêu dữ liệu tùy chỉnh bổ sung, do nhà phát triển chỉ định. |
request.resource
chứa tất cả những thứ này ngoại trừ generation
, đo etag
metageneration
timeCreated
được tạo và updated
.
Xác thực dữ liệu
Quy tắc bảo mật của Firebase cho Bộ nhớ đám mây cũng có thể được sử dụng để xác thực dữ liệu, bao gồm xác thực tên và đường dẫn tệp cũng như các thuộc tính siêu dữ liệu của tệp như contentType
và size
.
service firebase.storage { match /b/{bucket}/o { match /images/{imageId} { // Only allow uploads of any image file that's less than 5MB allow write: if request.resource.size < 5 * 1024 * 1024 && request.resource.contentType.matches('image/.*'); } } }
Các chức năng tùy chỉnh
Khi Quy tắc bảo mật Firebase của bạn trở nên phức tạp hơn, bạn có thể muốn đưa các nhóm điều kiện vào các chức năng mà bạn có thể sử dụng lại trên tập quy tắc của mình. Các quy tắc bảo mật hỗ trợ các chức năng tùy chỉnh. Cú pháp cho các hàm tùy chỉnh hơi giống JavaScript, nhưng các hàm Quy tắc bảo mật của Firebase được viết bằng ngôn ngữ dành riêng cho miền có một số hạn chế quan trọng:
- Các hàm chỉ có thể chứa một câu lệnh
return
duy nhất. Chúng không thể chứa bất kỳ logic bổ sung nào. Ví dụ, chúng không thể thực hiện các vòng lặp hoặc gọi các dịch vụ bên ngoài. - Các hàm có thể tự động truy cập các hàm và biến từ phạm vi mà chúng được xác định. Ví dụ: một hàm được xác định trong phạm vi
service firebase.storage
có quyền truy cập vào biếnresource
và chỉ đối với Cloud Firestore, các hàm tích hợp sẵn nhưget()
vàexists()
. - Các hàm có thể gọi các hàm khác nhưng không thể đệ quy. Tổng độ sâu ngăn xếp cuộc gọi được giới hạn ở 10.
- Trong phiên bản
rules2
, các hàm có thể xác định các biến bằng cách sử dụng từ khóalet
. Các hàm có thể có bất kỳ số ràng buộc let nào, nhưng phải kết thúc bằng câu lệnh trả về.
Một hàm được xác định với từ khóa function
và không có hoặc nhiều đối số. Ví dụ: bạn có thể muốn kết hợp hai loại điều kiện được sử dụng trong các ví dụ trên thành một hàm duy nhất:
service firebase.storage {
match /b/{bucket}/o {
// True if the user is signed in or the requested data is 'public'
function signedInOrPublic() {
return request.auth.uid != null || resource.data.visibility == 'public';
}
match /images/{imageId} {
allow read, write: if signedInOrPublic();
}
match /mp3s/{mp3Ids} {
allow read: if signedInOrPublic();
}
}
}
Việc sử dụng các chức năng trong Quy tắc bảo mật Firebase của bạn giúp chúng dễ bảo trì hơn khi mức độ phức tạp của các quy tắc của bạn ngày càng tăng.
Bước tiếp theo
Sau cuộc thảo luận về các điều kiện này, bạn đã hiểu rõ hơn về các Quy tắc và sẵn sàng:
Tìm hiểu cách xử lý các trường hợp sử dụng cốt lõi và tìm hiểu quy trình làm việc để phát triển, thử nghiệm và triển khai Quy tắc:
- Viết các quy tắc giải quyết các tình huống phổ biến .
- Xây dựng kiến thức của bạn bằng cách xem xét các tình huống mà bạn phải phát hiện và tránh các Quy tắc không an toàn .
- Quy tắc kiểm tra bằng cách sử dụng trình mô phỏng Cloud Storage và thư viện kiểm tra Quy tắc bảo mật chuyên dụng .
- Xem lại các phương pháp có sẵn để triển khai Quy tắc .
Hướng dẫn này được xây dựng dựa trên việc tìm hiểu cú pháp cốt lõi của hướng dẫn ngôn ngữ Quy tắc bảo mật Firebase để chỉ ra cách thêm các điều kiện vào Quy tắc bảo mật Firebase cho Lưu trữ đám mây của bạn.
Khối xây dựng chính của Quy tắc bảo mật lưu trữ đám mây là điều kiện . Điều kiện là một biểu thức boolean xác định xem một hoạt động cụ thể nên được phép hay bị từ chối. Đối với các quy tắc cơ bản, việc sử dụng các từ true
và false
làm điều kiện hoàn toàn hoạt động tốt. Tuy nhiên, Quy tắc bảo mật của Firebase cho ngôn ngữ Lưu trữ đám mây cung cấp cho bạn các cách để viết các điều kiện phức tạp hơn có thể:
- Kiểm tra xác thực người dùng
- Xác thực dữ liệu đến
Xác thực
Quy tắc bảo mật của Firebase cho Lưu trữ đám mây tích hợp với Xác thực Firebase để cung cấp xác thực dựa trên người dùng mạnh mẽ cho Lưu trữ đám mây. Điều này cho phép kiểm soát truy cập chi tiết dựa trên yêu cầu của mã thông báo Xác thực Firebase.
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 request.auth
được điền vào uid
của người dùng ( request.auth.uid
) cũng như các yêu cầu của JWT Xác thực Firebase ( request.auth.token
).
Ngoài ra, khi sử dụng xác thực tùy chỉnh, các xác nhận quyền sở hữu bổ sung sẽ xuất hiện trong trường request.auth.token
.
Khi người dùng chưa được xác thực thực hiện một yêu cầu, biến request.auth
là null
.
Sử dụng dữ liệu này, có một số cách phổ biến để sử dụng xác thực để bảo mật tệp:
- Công khai: bỏ qua
request.auth
- Riêng tư đã được xác thực: kiểm tra xem
request.auth
không phải lànull
- Người dùng riêng tư: kiểm tra xem
request.auth.uid
có bằnguid
đường dẫn không - Nhóm riêng tư: kiểm tra xác nhận quyền sở hữu của mã thông báo tùy chỉnh để khớp với xác nhận quyền sở hữu đã chọn hoặc đọc siêu dữ liệu tệp để xem liệu trường siêu dữ liệu có tồn tại hay không
Công cộng
Bất kỳ quy tắc nào không xem xét ngữ cảnh request.auth
đều có thể được coi là quy tắc public
, vì nó không xem xét ngữ cảnh xác thực của người dùng. Các quy tắc này có thể hữu ích để hiển thị dữ liệu công khai như nội dung trò chơi, tệp âm thanh hoặc nội dung tĩnh khác.
// Anyone to read a public image if the file is less than 100kB // Anyone can upload a public file ending in '.txt' match /public/{imageId} { allow read: if resource.size < 100 * 1024; allow write: if imageId.matches(".*\\.txt"); }
Đã xác thực riêng tư
Trong một số trường hợp nhất định, bạn có thể muốn tất cả người dùng đã xác thực ứng dụng của mình có thể xem được dữ liệu, nhưng không phải bởi những người dùng chưa được xác thực. Vì biến request.auth
là null
đối với tất cả người dùng chưa được xác thực, tất cả những gì bạn phải làm là kiểm tra biến request.auth
tồn tại để yêu cầu xác thực:
// Require authentication on all internal image reads match /internal/{imageId} { allow read: if request.auth != null; }
Người dùng riêng tư
Cho đến nay, trường hợp sử dụng phổ biến nhất cho request.auth
sẽ là cung cấp cho người dùng cá nhân các quyền chi tiết đối với tệp của họ: từ tải ảnh hồ sơ lên đến đọc tài liệu riêng tư.
Vì các tệp trong Bộ nhớ đám mây có "đường dẫn" đầy đủ đến tệp, tất cả những gì cần thiết để tạo tệp do người dùng kiểm soát là một phần thông tin nhận dạng người dùng duy nhất trong tiền tố tên tệp (chẳng hạn như uid
của người dùng) có thể được kiểm tra khi quy tắc được đánh giá:
// Only a user can upload their profile picture, but anyone can view it match /users/{userId}/profilePicture.png { allow read; allow write: if request.auth.uid == userId; }
Nhóm riêng tư
Một trường hợp sử dụng phổ biến không kém khác sẽ là cho phép nhóm quyền trên một đối tượng, chẳng hạn như cho phép một số thành viên trong nhóm cộng tác trên một tài liệu được chia sẻ. Có một số cách tiếp cận để thực hiện điều này:
- Đúc kết mã thông báo tùy chỉnh Xác thực Firebase chứa thông tin bổ sung về thành viên nhóm (chẳng hạn như ID nhóm)
- Bao gồm thông tin nhóm (chẳng hạn như ID nhóm hoặc danh sách các
uid
được ủy quyền) trong siêu dữ liệu tệp
Khi dữ liệu này được lưu trữ trong mã thông báo hoặc siêu dữ liệu tệp, nó có thể được tham chiếu từ bên trong một quy tắc:
// Allow reads if the group ID in your token matches the file metadata's `owner` property // Allow writes if the group ID is in the user's custom token match /files/{groupId}/{fileName} { allow read: if resource.metadata.owner == request.auth.token.groupId; allow write: if request.auth.token.groupId == groupId; }
Yêu cầu đánh giá
Tải lên, tải xuống, thay đổi siêu dữ liệu và xóa được đánh giá bằng cách sử dụng request
được gửi tới Cloud Storage. Ngoài ID duy nhất của người dùng và trọng tải Xác thực Firebase trong đối tượng request.auth
như được mô tả ở trên, biến request
chứa đường dẫn tệp nơi yêu cầu đang được thực hiện, thời điểm nhận được yêu cầu và giá trị resource
mới nếu yêu cầu là một bản viết. Tiêu đề HTTP và trạng thái xác thực cũng được bao gồm.
Đối tượng request
cũng chứa ID duy nhất của người dùng và trọng tải Xác thực Firebase trong đối tượng request.auth
, sẽ được giải thích thêm trong phần Bảo mật dựa trên người dùng của tài liệu.
Dưới đây là danh sách đầy đủ các thuộc tính trong đối tượng request
:
Tài sản | Loại hình | Sự mô tả |
---|---|---|
auth | map <string, string> | Khi người dùng đăng nhập, hãy cung cấp uid , ID duy nhất của người dùng và token , bản đồ xác thực Firebase JWT tuyên bố. Nếu không, nó sẽ là null . |
params | map <string, string> | Bản đồ chứa các tham số truy vấn của yêu cầu. |
path | đường dẫn | Một path đại diện cho đường dẫn mà yêu cầu đang được thực hiện. |
resource | map <string, string> | Giá trị tài nguyên mới, chỉ hiển thị khi yêu cầu write . |
time | dấu thời gian | Dấu thời gian đại diện cho thời gian máy chủ mà yêu cầu được đánh giá tại. |
Đánh giá nguồn lực
Khi đánh giá các quy tắc, bạn cũng có thể muốn đánh giá siêu dữ liệu của tệp đang được tải lên, tải xuống, sửa đổi hoặc xóa. Điều này cho phép bạn tạo các quy tắc phức tạp và mạnh mẽ để thực hiện những việc như chỉ cho phép các tệp có loại nội dung nhất định được tải lên hoặc chỉ các tệp lớn hơn một kích thước nhất định mới bị xóa.
Quy tắc bảo mật của Firebase cho Lưu trữ đám mây cung cấp siêu dữ liệu tệp trong đối tượng resource
, chứa các cặp khóa / giá trị của siêu dữ liệu hiển thị trong đối tượng Lưu trữ đám mây. Các thuộc tính này có thể được kiểm tra trên các yêu cầu read
hoặc write
để đảm bảo tính toàn vẹn của dữ liệu.
Khi yêu cầu write
(chẳng hạn như tải lên, cập nhật siêu dữ liệu và xóa), ngoài đối tượng resource
, chứa siêu dữ liệu tệp cho tệp hiện đang tồn tại ở đường dẫn yêu cầu, bạn cũng có thể sử dụng đối tượng request.resource
, trong đó chứa một tập hợp con của siêu dữ liệu tệp sẽ được ghi nếu việc ghi được cho phép. Bạn có thể sử dụng hai giá trị này để đảm bảo tính toàn vẹn của dữ liệu hoặc thực thi các ràng buộc ứng dụng như loại hoặc kích thước tệp.
Dưới đây là danh sách đầy đủ các thuộc tính trong đối tượng resource
:
Tài sản | Loại hình | Sự mô tả |
---|---|---|
name | sợi dây | Tên đầy đủ của đối tượng |
bucket | sợi dây | Tên của thùng chứa đối tượng này. |
generation | int | Việc tạo đối tượng Google Cloud Storage của đối tượng này. |
metageneration | int | Việc kiểm soát đối tượng Google Cloud Storage của đối tượng này. |
size | int | Kích thước của đối tượng tính bằng byte. |
timeCreated | dấu thời gian | Dấu thời gian biểu thị thời gian một đối tượng được tạo. |
updated | dấu thời gian | Dấu thời gian đại diện cho thời gian một đối tượng được cập nhật lần cuối. |
md5Hash | sợi dây | Một băm MD5 của đối tượng. |
crc32c | sợi dây | Một hàm băm crc32c của đối tượng. |
etag | sợi dây | Etag liên kết với đối tượng này. |
contentDisposition | sợi dây | Sự bố trí nội dung liên quan đến đối tượng này. |
contentEncoding | sợi dây | Mã hóa nội dung được liên kết với đối tượng này. |
contentLanguage | sợi dây | Ngôn ngữ nội dung được liên kết với đối tượng này. |
contentType | sợi dây | Loại nội dung được liên kết với đối tượng này. |
metadata | map <string, string> | Các cặp khóa / giá trị của siêu dữ liệu tùy chỉnh bổ sung, do nhà phát triển chỉ định. |
request.resource
chứa tất cả những thứ này ngoại trừ generation
, đo etag
metageneration
timeCreated
được tạo và updated
.
Xác thực dữ liệu
Quy tắc bảo mật của Firebase cho Bộ nhớ đám mây cũng có thể được sử dụng để xác thực dữ liệu, bao gồm xác thực tên và đường dẫn tệp cũng như các thuộc tính siêu dữ liệu của tệp như contentType
và size
.
service firebase.storage { match /b/{bucket}/o { match /images/{imageId} { // Only allow uploads of any image file that's less than 5MB allow write: if request.resource.size < 5 * 1024 * 1024 && request.resource.contentType.matches('image/.*'); } } }
Các chức năng tùy chỉnh
Khi Quy tắc bảo mật Firebase của bạn trở nên phức tạp hơn, bạn có thể muốn đưa các nhóm điều kiện vào các chức năng mà bạn có thể sử dụng lại trên tập quy tắc của mình. Các quy tắc bảo mật hỗ trợ các chức năng tùy chỉnh. Cú pháp cho các hàm tùy chỉnh hơi giống JavaScript, nhưng các hàm Quy tắc bảo mật của Firebase được viết bằng ngôn ngữ dành riêng cho miền có một số hạn chế quan trọng:
- Các hàm chỉ có thể chứa một câu lệnh
return
duy nhất. Chúng không thể chứa bất kỳ logic bổ sung nào. Ví dụ, chúng không thể thực hiện các vòng lặp hoặc gọi các dịch vụ bên ngoài. - Các hàm có thể tự động truy cập các hàm và biến từ phạm vi mà chúng được xác định. Ví dụ: một hàm được xác định trong phạm vi
service firebase.storage
có quyền truy cập vào biếnresource
và chỉ đối với Cloud Firestore, các hàm tích hợp sẵn nhưget()
vàexists()
. - Các hàm có thể gọi các hàm khác nhưng không thể đệ quy. Tổng độ sâu ngăn xếp cuộc gọi được giới hạn ở 10.
- Trong phiên bản
rules2
, các hàm có thể xác định các biến bằng cách sử dụng từ khóalet
. Các hàm có thể có bất kỳ số ràng buộc let nào, nhưng phải kết thúc bằng câu lệnh trả về.
Một hàm được xác định với từ khóa function
và không có hoặc nhiều đối số. Ví dụ: bạn có thể muốn kết hợp hai loại điều kiện được sử dụng trong các ví dụ trên thành một hàm duy nhất:
service firebase.storage {
match /b/{bucket}/o {
// True if the user is signed in or the requested data is 'public'
function signedInOrPublic() {
return request.auth.uid != null || resource.data.visibility == 'public';
}
match /images/{imageId} {
allow read, write: if signedInOrPublic();
}
match /mp3s/{mp3Ids} {
allow read: if signedInOrPublic();
}
}
}
Việc sử dụng các chức năng trong Quy tắc bảo mật Firebase của bạn giúp chúng dễ bảo trì hơn khi mức độ phức tạp của các quy tắc của bạn ngày càng tăng.
Bước tiếp theo
Sau cuộc thảo luận về các điều kiện này, bạn đã hiểu rõ hơn về các Quy tắc và sẵn sàng:
Tìm hiểu cách xử lý các trường hợp sử dụng cốt lõi và tìm hiểu quy trình làm việc để phát triển, thử nghiệm và triển khai Quy tắc:
- Viết các quy tắc giải quyết các tình huống phổ biến .
- Xây dựng kiến thức của bạn bằng cách xem xét các tình huống mà bạn phải phát hiện và tránh các Quy tắc không an toàn .
- Quy tắc kiểm tra bằng cách sử dụng trình mô phỏng Cloud Storage và thư viện kiểm tra Quy tắc bảo mật chuyên dụng .
- Xem lại các phương pháp có sẵn để triển khai Quy tắc .