เพิ่ม security rule
รู้จักกับ Security rule ใน Cloud storage
document ต้นฉบับ: https://firebase.google.com/docs/storage/security/rules-conditions
เช่นเดียวกันกับ Firestore Cloud storage เองก็มีการจำกัดสิทธิ์ไว้เหมือนกัน โดยปกติจะมี 2 สิทธิใหญ่ๆคือ read (อ่านข้อมูล) และ write (เขียนข้อมูล) ขอให้จำไว้ 1 อย่าง
- การ
getDownloadURL
ออกมาได้ แม้จะกั้นสิทธิ์ผ่าน firestore ว่าไม่ให้ read แต่ยังสามารถอ่านผ่าน url ได้เช่นเดิม (เนื่องจากมันโดนแปลงเป็น public path ไปแล้ว) - สามารถใช้ข้อมูลจาก Firestore มาอ้างอิงในการเช็คสิทธิได้ เช่น เช็คว่า user นั้นเป็น admin หรือไม่ (ดูตัวอย่างได้ผ่าน case admin)
เราจะมาลองเพิ่ม 2 case เข้าไปกัน โดย
- ที่ local นั้นจะแก้ได้ผ่าน
storage.rules
- ที่ server จะแก้ได้ผ่านหน้า Service ของ Cloud storage
ภาพ profile ไม่สามารถถูก upload โดยคนอื่นได้นอกจากเจ้าของ
เนื่องจาก เราใช้ชื่อ folder เป็น uid อยู่แล้ว = ดักต ามชื่อ folder ได้เลย ว่า
- ถ้าชื่อ folder uid เหมือนกันกับที่ login เข้ามา = ให้ upload ได้
- เคสอื่นไม่อนุญาตให้ upload ได้
เพิ่มที่ storage.rules
service firebase.storage {
match /b/{bucket}/o {
match /users/{userId}/{imageId} {
allow read;
allow write: if request.auth.uid == userId;
}
}
}
ภาพ product ไม่สามารถถูก upload ได้นอกจาก admin
สามารถใช้คำสั่ง firestore.get
เข้าถึงข้อมูลใน Firestore ได้ โดยการเข้าไปดึงผ่าน uid และ ดึง data role ออกมาเช็คว่าต้องไม่ใช่ member = ถึงจะแก้ไขได้
เพิ่มที่ storage.rules
service firebase.storage {
match /b/{bucket}/o {
match /products/{productId} {
allow read;
allow write: if request.auth != null && firestore.get(/databases/(default)/documents/users/$(request.auth.uid)).data.role != 'member';
}
}
}