Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Tìm hiểu cú pháp cốt lõi của Quy tắc bảo mật Firebase cho ngôn ngữ lưu trữ đám mây

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Quy tắc bảo mật của Firebase cho Lưu trữ đám mây cho phép bạn kiểm soát quyền truy cập vào các đối tượng được lưu trữ trong nhóm Lưu trữ trên đám mây. Cú pháp quy tắc linh hoạt cho phép bạn tạo các quy tắc để kiểm soát bất kỳ hoạt động nào, từ tất cả các lần ghi vào bộ chứa Cloud Storage của bạn đến các hoạt động trên một tệp cụ thể.

Hướng dẫn này mô tả cú pháp và cấu trúc cơ bản của Quy tắc bảo mật lưu trữ đám mây để tạo bộ quy tắc hoàn chỉnh.

Khai báo dịch vụ và cơ sở dữ liệu

Quy tắc bảo mật của Firebase cho Bộ nhớ đám mây luôn bắt đầu bằng khai báo sau:

service firebase.storage {
    // ...
}

Khai báo service firebase.storage mở rộng các quy tắc đến Cloud Storage, ngăn ngừa xung đột giữa Quy tắc bảo mật lưu trữ trên đám mây và quy tắc cho các sản phẩm khác như Cloud Firestore.

Các quy tắc đọc / ghi cơ bản

Các quy tắc cơ bản bao gồm câu lệnh match xác định nhóm Bộ nhớ đám mây, câu lệnh đối sánh chỉ định tên tệp và biểu thức allow nêu chi tiết khi nào được phép đọc dữ liệu được chỉ định. biểu thức allow chỉ định các phương thức truy cập (ví dụ: đọc, ghi) có liên quan và các điều kiện mà quyền truy cập được cho phép hoặc bị từ chối.

Trong bộ quy tắc mặc định của bạn, câu lệnh so match đầu tiên sử dụng biểu thức ký tự đại diện {bucket} để chỉ ra các quy tắc áp dụng cho tất cả các nhóm trong dự án của bạn. Chúng ta sẽ thảo luận thêm về ý tưởng đối sánh ký tự đại diện trong phần tiếp theo.

service firebase.storage {
  // The {bucket} wildcard indicates we match files in all Cloud Storage buckets
  match /b/{bucket}/o {
    // Match filename
    match /filename {
      allow read: if <condition>;
      allow write: if <condition>;
    }
  }
}

Tất cả các câu lệnh khớp đều trỏ đến tệp. Câu lệnh so khớp có thể trỏ đến một tệp cụ thể, như trong match /images/profilePhoto.png .

Khớp các ký tự đại diện

Ngoài việc trỏ đến một tệp, Quy tắc có thể sử dụng các ký tự đại diện để trỏ đến bất kỳ tệp nào có tiền tố chuỗi nhất định trong tên của nó, bao gồm cả dấu gạch chéo, như trong match /images/{imageId} .

Trong ví dụ trên, câu lệnh so khớp sử dụng cú pháp ký tự đại diện {imageId} . Điều này có nghĩa là quy tắc áp dụng cho bất kỳ tệp nào có /images/ ở đầu tên của nó, chẳng hạn như /images/profilePhoto.png hoặc /images/croppedProfilePhoto.png . Khi các biểu thức allow trong câu lệnh so khớp được đánh giá, biến imageId sẽ phân giải thành tên tệp hình ảnh, chẳng hạn như profilePhoto.png hoặc croppedProfilePhoto.png .

Một biến ký tự đại diện có thể được tham chiếu từ bên trong match để cung cấp tên tệp hoặc ủy quyền đường dẫn:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

Dữ liệu phân cấp

Như chúng tôi đã nói trước đây, không có cấu trúc phân cấp bên trong một nhóm Cloud Storage. Nhưng bằng cách sử dụng quy ước đặt tên tệp, thường là quy ước bao gồm dấu gạch chéo trong tên tệp, chúng ta có thể bắt chước một cấu trúc trông giống như một chuỗi các thư mục và thư mục con lồng nhau. Điều quan trọng là phải hiểu cách Quy tắc bảo mật Firebase tương tác với các tên tệp này.

Hãy xem xét tình huống của một tập hợp các tệp có tên tất cả đều bắt đầu bằng /images/ gốc. Quy tắc bảo mật của Firebase chỉ áp dụng cho tên tệp phù hợp, do đó, các điều khiển truy cập được xác định trên /images/ stem không áp dụng cho /mp3s/ stem. Thay vào đó, hãy viết các quy tắc rõ ràng phù hợp với các mẫu tên tệp khác nhau:

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      allow read, write: if <condition>;
    }

    // Explicitly define rules for the 'mp3s' pattern
    match /mp3s/{mp3Id} {
      allow read, write: if <condition>;
    }
  }
}

Khi lồng nhau các câu lệnh so match , đường dẫn của câu lệnh so match bên trong luôn được nối vào đường dẫn của câu lệnh so match bên ngoài. Do đó, hai bộ quy tắc sau là tương đương:

service firebase.storage {
  match /b/{bucket}/o {
    match /images {
      // Exact match for "images/profilePhoto.png"
      match /profilePhoto.png {
        allow write: if <condition>;
      }
    }
  }
}
service firebase.storage {
  match /b/{bucket}/o {
    // Exact match for "images/profilePhoto.png"
    match /images/profilePhoto.png {
      allow write: if <condition>;
      }
  }
}

Ký tự đại diện đối sánh đệ quy

Ngoài các ký tự đại diện khớp và trả về chuỗi ở cuối tên tệp, một ký tự đại diện nhiều đoạn có thể được khai báo để đối sánh phức tạp hơn bằng cách thêm =** vào tên ký tự đại diện, như {path=**} :

// Partial match for files that start with "images"
match /images {

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

Nếu nhiều quy tắc khớp với một tệp, kết quả là OR của kết quả của tất cả các đánh giá quy tắc. Nghĩa là, nếu bất kỳ quy tắc nào mà tệp phù hợp được đánh giá true , thì kết quả là true .

Trong các quy tắc ở trên, tệp "images / other_condition " có thể được đọc nếu condition hoặc điều kiện khác đánh giá thành true, trong khi tệp "hình ảnh / người dùng / người dùng: 12345 / other_condition " chỉ tuân theo kết quả của điều kiện khác .

Quy tắc bảo mật lưu trữ đám mây không phân tầng và quy tắc chỉ được đánh giá khi đường dẫn yêu cầu khớp với đường dẫn có quy tắc được chỉ định.

Phiên bản 1

Theo mặc định, Quy tắc bảo mật Firebase sử dụng phiên bản 1. Trong phiên bản 1, các ký tự đại diện đệ quy khớp với một hoặc nhiều phần tử tên tệp, không khớp với không hoặc nhiều phần tử. Do đó, match /images/{filenamePrefixWildcard}/{imageFilename=**} khớp với tên tệp như /images/profilePics/profile.png, nhưng không khớp với /images/badge.png. Thay vào đó, hãy sử dụng /images/{imagePrefixorFilename=**} .

Các ký tự đại diện đệ quy phải ở cuối câu lệnh so khớp.

Chúng tôi khuyên bạn nên sử dụng phiên bản 2 để có các tính năng mạnh mẽ hơn.

Phiên bản 2

Trong phiên bản 2 của Quy tắc bảo mật Firebase, các ký tự đại diện đệ quy khớp với không hoặc nhiều mục đường dẫn. Do đó, /images/{filenamePrefixWildcard}/{imageFilename=**} khớp với tên tệp /images/profilePics/profile.png và /images/badge.png.

Bạn phải chọn tham gia phiên bản 2 bằng cách thêm rules_version = '2'; ở đầu các quy tắc bảo mật của bạn:

rules_version = '2';
service cloud.storage {
  match /b/{bucket}/o {
   ...
 }
}

Bạn có thể có nhiều nhất một ký tự đại diện đệ quy cho mỗi câu lệnh so khớp, nhưng trong phiên bản 2, bạn có thể đặt ký tự đại diện này ở bất kỳ đâu trong câu lệnh so khớp. Ví dụ:

rules_version = '2';
service firebase.storage {
 match /b/{bucket}/o {
   // Matches any file in a songs "subdirectory" under the
   // top level of your Cloud Storage bucket.
   match /{prefixSegment=**}/songs/{mp3filenames} {
     allow read, write: if <condition>;
   }
  }
}

Hoạt động chi tiết

Trong một số tình huống, sẽ rất hữu ích khi chia nhỏ việc readwrite thành các thao tác chi tiết hơn. Ví dụ: ứng dụng của bạn có thể muốn thực thi các điều kiện khác nhau về tạo tệp so với xóa tệp.

Một thao tác read có thể được chia thành getlist .

Quy tắc write có thể được chia thành create , updatedelete :

service firebase.storage {
  match /b/{bucket}/o {
    // A read rule can be divided into read and list rules
    match /images/{imageId} {
      // Applies to single file read requests
      allow get: if <condition>;
      // Applies to list and listAll requests (Rules Version 2)
      allow list: if <condition>;

    // A write rule can be divided into create, update, and delete rules
    match /images/{imageId} {
      // Applies to writes to file contents
      allow create: if <condition>;

      // Applies to updates to (pre-existing) file metadata
      allow update: if <condition>;

      // Applies to delete operations
      allow delete: if <condition>;
    }
  }
 }
}

Các câu lệnh trùng khớp

Có thể tên tệp khớp với nhiều câu lệnh match . Trong trường hợp nhiều biểu thức allow khớp với một yêu cầu, quyền truy cập được cho phép nếu bất kỳ điều kiện nào là true :

service firebase.storage {
  match b/{bucket}/o {
    // Matches file names directly inside of '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches file names anywhere under `/images/`
    match /images/{imageId=**} {
      allow read, write: if true;
    }
  }
}

Trong ví dụ trên, tất cả các lần đọc và ghi vào các tệp có tên bắt đầu bằng /images/ đều được phép vì quy tắc thứ hai luôn true , ngay cả khi quy tắc đầu tiên là false .

Quy tắc không phải là bộ lọc

Sau khi bạn bảo mật dữ liệu của mình và bắt đầu thực hiện các thao tác với tệp, hãy nhớ rằng các quy tắc bảo mật không phải là bộ lọc. Bạn không thể thực hiện các thao tác trên một tập hợp các tệp phù hợp với mẫu tên tệp và mong đợi Cloud Storage chỉ truy cập vào các tệp mà ứng dụng khách hiện tại có quyền truy cập.

Ví dụ: lấy quy tắc bảo mật sau:

service firebase.storage {
  match /b/{bucket}/o {
    // Allow the client to read files with contentType 'image/png'
    match /aFileNamePrefix/{aFileName} {
      allow read: if resource.contentType == 'image/png';
    }
  }
}

Bị từ chối : Quy tắc này từ chối yêu cầu sau vì tập kết quả có thể bao gồm các tệp trong đó contentType không phải là image/png :

Web
filesRef = storage.ref().child("aFilenamePrefix");

filesRef.listAll()
    .then(function(result) {
      console.log("Success: ", result.items);
    })
});

Các quy tắc trong Quy tắc bảo mật lưu trữ đám mây đánh giá từng truy vấn dựa trên kết quả tiềm năng của nó và không thực hiện được yêu cầu nếu nó có thể trả về tệp mà khách hàng không có quyền đọc. Các yêu cầu truy cập phải tuân theo các ràng buộc do các quy tắc của bạn đặt ra.

Bước tiếp theo

Bạn có thể hiểu sâu hơn về Quy tắc bảo mật của Firebase cho Bộ nhớ trên đám mây:

Bạn có thể khám phá các trường hợp sử dụng Quy tắc bảo mật của Firebase dành riêng cho Cloud Storage: