Skip to main content

เพิ่ม 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

security-01

ภาพ 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';
}
}
}