กฎความปลอดภัยของ Firebase สำหรับ Cloud Storage ช่วยให้คุณควบคุมการเข้าถึงออบเจ็กต์ที่จัดเก็บไว้ในที่เก็บข้อมูล Cloud Storage ไวยากรณ์กฎที่ยืดหยุ่นช่วยให้คุณสร้างกฎเพื่อควบคุมการดำเนินการใดๆ ได้ ตั้งแต่การเขียนทั้งหมดไปยังที่เก็บข้อมูล Cloud Storage ไปจนถึงการดำเนินการในไฟล์ที่ระบุ
คู่มือนี้จะอธิบายไวยากรณ์และโครงสร้างพื้นฐานของกฎความปลอดภัยของ Cloud Storage เพื่อสร้างชุดกฎที่สมบูรณ์
การประกาศบริการและฐานข้อมูล
กฎความปลอดภัยของ Firebase สำหรับ Cloud Storage จะเริ่มต้นด้วยการประกาศต่อไปนี้เสมอ:
service firebase.storage {
// ...
}
การประกาศ service firebase.storage
จะกำหนดขอบเขตกฎไปยัง Cloud Storage เพื่อป้องกันความขัดแย้งระหว่างกฎความปลอดภัยของ Cloud Storage และกฎสำหรับผลิตภัณฑ์อื่นๆ เช่น Cloud Firestore
กฎพื้นฐานการอ่าน/เขียน
กฎพื้นฐานประกอบด้วยคำสั่งการจับ match
ที่ระบุที่เก็บข้อมูล Cloud Storage คำสั่งการจับคู่ที่ระบุชื่อไฟล์ และ allow
แสดงรายละเอียดนิพจน์เมื่ออ่านข้อมูลที่ระบุ allow
นิพจน์ระบุ วิธีการเข้าถึง (เช่น อ่าน เขียน) ที่เกี่ยวข้อง และ เงื่อนไข ที่อนุญาตหรือปฏิเสธการเข้าถึง
ในชุดกฎเริ่มต้นของคุณ คำสั่ง match
ตรงกันรายการแรกจะใช้นิพจน์ตัวแทน {bucket}
เพื่อระบุว่ากฎใช้กับที่เก็บข้อมูลทั้งหมดในโปรเจ็กต์ของคุณ เราจะหารือเกี่ยวกับแนวคิดของการจับคู่ไวด์การ์ดเพิ่มเติมในหัวข้อถัดไป
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>;
}
}
}
คำสั่งการจับคู่ทั้งหมดชี้ไปที่ไฟล์ คำสั่งการจับคู่สามารถชี้ไปที่ไฟล์ใดไฟล์หนึ่งได้ เช่นเดียวกับใน match /images/profilePhoto.png
จับคู่ไวด์การ์ด
นอกเหนือจากการชี้ไปที่ไฟล์เดียวแล้ว Rules ยังสามารถใช้ ไวด์การ์ด เพื่อชี้ไปยังไฟล์ใดๆ ที่มีคำนำหน้าสตริงที่กำหนดในชื่อ รวมถึงเครื่องหมายทับ เช่นเดียวกับใน match /images/{imageId}
ในตัวอย่างข้างต้น คำสั่งการจับคู่ใช้ไวยากรณ์ไวด์การ์ด {imageId}
ซึ่งหมายความว่ากฎนี้ใช้กับไฟล์ใดๆ ที่มี /images/
นำหน้าชื่อ เช่น /images/profilePhoto.png
หรือ /images/croppedProfilePhoto.png
เมื่อมีการประเมินนิพจน์ allow
ในคำสั่งการจับคู่ ตัวแปร imageId
จะแก้ไขเป็นชื่อไฟล์รูปภาพ เช่น profilePhoto.png
หรือ croppedProfilePhoto.png
ตัวแปรไวด์การ์ดสามารถอ้างอิงได้จากภายใน match
เพื่อระบุชื่อไฟล์หรือการอนุญาตเส้นทาง:
// Another way to restrict the name of a file
match /images/{imageId} {
allow read: if imageId == "profilePhoto.png";
}
ข้อมูลแบบลำดับชั้น
ดังที่เราได้กล่าวไว้ก่อนหน้านี้ ไม่มีโครงสร้างแบบลำดับชั้นภายในที่เก็บข้อมูล Cloud Storage แต่ด้วยการใช้หลักการตั้งชื่อไฟล์ ซึ่งมักจะใช้เครื่องหมายทับในชื่อไฟล์ เราสามารถเลียนแบบโครงสร้างที่ดูเหมือนชุดของไดเร็กทอรีและไดเร็กทอรีย่อยที่ซ้อนกันได้ สิ่งสำคัญคือต้องเข้าใจว่ากฎความปลอดภัยของ Firebase โต้ตอบกับชื่อไฟล์เหล่านี้อย่างไร
พิจารณาสถานการณ์ของชุดไฟล์ที่มีชื่อที่ขึ้นต้นด้วย /images/
ต้นกำเนิด กฎความปลอดภัยของ Firebase ใช้กับชื่อไฟล์ที่ตรงกันเท่านั้น ดังนั้นการควบคุมการเข้าถึงที่กำหนดไว้ใน /images/
Stem จะไม่ใช้กับ /mp3s/
Stem ให้เขียนกฎที่ชัดเจนซึ่งตรงกับรูปแบบชื่อไฟล์ที่แตกต่างกันแทน:
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>;
}
}
}
เมื่อซ้อนคำสั่งการจับ match
เส้นทางของคำสั่ง match
ภายในจะถูกผนวกเข้ากับเส้นทางของคำสั่งการ match
ภายนอกเสมอ ดังนั้นกฎสองข้อต่อไปนี้จึงเทียบเท่ากัน:
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>;
}
}
}
ไวด์การ์ดการจับคู่แบบเรียกซ้ำ
นอกจากไวด์การ์ดที่จับคู่และส่งกลับสตริงที่ส่วนท้ายของชื่อไฟล์แล้ว ยังสามารถประกาศ ไวด์การ์ดหลายเซ็กเมนต์ เพื่อให้การจับคู่ที่ซับซ้อนมากขึ้นได้โดยเพิ่ม =**
ให้กับชื่อไวด์การ์ด เช่น {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>;
}
}
หากกฎหลายข้อตรงกับไฟล์ ผลลัพธ์จะเป็น OR
ของผลลัพธ์ของการประเมินกฎทั้งหมด นั่นคือ หากกฎใดๆ ที่ไฟล์ตรงกันประเมินว่าเป็น true
ผลลัพธ์จะเป็น true
ในกฎข้างต้น ไฟล์ "images/profilePhoto.png" สามารถอ่านได้หาก condition
หรือ other_condition
ประเมินเป็นจริง ในขณะที่ไฟล์ "images/users/user:12345/profilePhoto.png" จะขึ้นอยู่กับผลลัพธ์ของ other_condition
เท่านั้น .
กฎความปลอดภัยของ Cloud Storage จะไม่เรียงซ้อน และกฎจะได้รับการประเมินเมื่อเส้นทางคำขอตรงกับเส้นทางที่มีกฎที่ระบุเท่านั้น
เวอร์ชัน 1
กฎความปลอดภัยของ Firebase จะใช้เวอร์ชัน 1 เป็นค่าเริ่มต้น ในเวอร์ชัน 1 ไวด์การ์ดแบบเรียกซ้ำจะจับคู่องค์ประกอบชื่อไฟล์ตั้งแต่หนึ่งองค์ประกอบขึ้นไป ไม่ใช่องค์ประกอบที่เป็นศูนย์หรือมากกว่า ดังนั้น match /images/{filenamePrefixWildcard}/{imageFilename=**}
จะจับคู่ชื่อไฟล์เช่น /images/profilePics/profile.png แต่ไม่ใช่ /images/badge.png ใช้ /images/{imagePrefixorFilename=**}
แทน
สัญลักษณ์แทนแบบเรียกซ้ำต้องอยู่ท้ายคำสั่งที่ตรงกัน
เราขอแนะนำให้คุณใช้เวอร์ชัน 2 เพื่อคุณสมบัติที่ทรงพลังยิ่งขึ้น
เวอร์ชัน 2
ในกฎความปลอดภัยของ Firebase เวอร์ชัน 2 ไวลด์การ์ดแบบเรียกซ้ำจะจับคู่กับรายการเส้นทางตั้งแต่ 0 รายการขึ้นไป ดังนั้น /images/{filenamePrefixWildcard}/{imageFilename=**}
จะจับคู่ชื่อไฟล์ /images/profilePics/profile.png และ /images/badge.png
คุณต้องเลือกใช้เวอร์ชัน 2 โดยการเพิ่ม rules_version = '2';
ที่ด้านบนของกฎความปลอดภัยของคุณ:
rules_version = '2';
service cloud.storage {
match /b/{bucket}/o {
...
}
}
คุณสามารถมีไวด์การ์ดแบบเรียกซ้ำได้มากที่สุดหนึ่งรายการต่อคำสั่งการจับคู่ แต่ในเวอร์ชัน 2 คุณสามารถวางไวด์การ์ดนี้ไว้ที่ใดก็ได้ในคำสั่งการจับคู่ ตัวอย่างเช่น:
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>;
}
}
}
การดำเนินการแบบละเอียด
ในบางสถานการณ์ การแยกย่อย read
และ write
ออกเป็นการดำเนินการที่ละเอียดยิ่งขึ้นจะมีประโยชน์ ตัวอย่างเช่น แอปของคุณอาจต้องการบังคับใช้เงื่อนไขในการสร้างไฟล์ที่แตกต่างจากการลบไฟล์
การดำเนินการ read
สามารถแบ่งออกเป็น get
และ list
ได้
กฎ write
สามารถแบ่งออกเป็น create
, update
และ delete
:
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>; } } } }
คำสั่งการจับคู่ที่ทับซ้อนกัน
เป็นไปได้ที่ชื่อไฟล์จะตรงกับคำสั่ง match
มากกว่าหนึ่งรายการ ในกรณีที่นิพจน์ allow
หลายรายการตรงกับคำขอ การเข้าถึงจะได้รับอนุญาตหากมีเงื่อนไข ใด ๆ เป็น 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;
}
}
}
ในตัวอย่างข้างต้น อนุญาตให้อ่านและเขียนไฟล์ทั้งหมดที่ชื่อขึ้นต้นด้วย /images/
เนื่องจากกฎข้อที่สองเป็น true
เสมอ แม้ว่ากฎข้อแรกจะเป็น false
ก็ตาม
กฎไม่ใช่ตัวกรอง
เมื่อคุณรักษาความปลอดภัยข้อมูลของคุณและเริ่มดำเนินการกับไฟล์แล้ว โปรดทราบว่ากฎความปลอดภัยไม่ใช่ตัวกรอง คุณไม่สามารถดำเนินการกับชุดไฟล์ที่ตรงกับรูปแบบชื่อไฟล์ได้ และคาดว่า Cloud Storage จะเข้าถึงเฉพาะไฟล์ที่ไคลเอ็นต์ปัจจุบันมีสิทธิ์เข้าถึงเท่านั้น
ตัวอย่างเช่น ใช้กฎความปลอดภัยต่อไปนี้:
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';
}
}
}
Denied : กฎนี้ปฏิเสธคำขอต่อไปนี้เนื่องจากชุดผลลัพธ์สามารถรวมไฟล์ที่ contentType
ไม่ใช่ image/png
:
เว็บ
filesRef = storage.ref().child("aFilenamePrefix"); filesRef.listAll() .then(function(result) { console.log("Success: ", result.items); }) });
กฎในกฎความปลอดภัยของ Cloud Storage จะประเมินแต่ละคำค้นหาโดยเทียบกับผลลัพธ์ที่เป็นไปได้ และล้มเหลวในการร้องขอหากสามารถส่งคืนไฟล์ที่ไคลเอ็นต์ไม่มีสิทธิ์ในการอ่าน คำขอเข้าถึงต้องเป็นไปตามข้อจำกัดที่กำหนดโดยกฎของคุณ
ขั้นตอนถัดไป
คุณสามารถทำความเข้าใจกฎการรักษาความปลอดภัยของ Firebase สำหรับ Cloud Storage ให้ลึกซึ้งยิ่งขึ้น:
เรียนรู้แนวคิดหลักถัดไปของภาษาของกฎ เงื่อนไข แบบไดนามิก ซึ่งช่วยให้กฎของคุณสามารถตรวจสอบการให้สิทธิ์ผู้ใช้ เปรียบเทียบข้อมูลที่มีอยู่และข้อมูลขาเข้า ตรวจสอบข้อมูลที่เข้ามา และอื่นๆ
ตรวจสอบกรณีการใช้งานด้านความปลอดภัยทั่วไปและ คำจำกัดความของกฎความปลอดภัยของ Firebase ที่จัดการกับสิ่งเหล่านี้
คุณสามารถสำรวจกรณีการใช้งานกฎความปลอดภัยของ Firebase เฉพาะสำหรับ Cloud Storage ได้ ดังนี้