กฎความปลอดภัยของ Firebase ให้การควบคุมการเข้าถึงและการตรวจสอบข้อมูลในรูปแบบที่รองรับความซับซ้อนหลายระดับ หากต้องการสร้างระบบการเข้าถึงตามผู้ใช้และตามบทบาทที่รักษาข้อมูลผู้ใช้ของคุณให้ปลอดภัย ให้ใช้ การตรวจสอบสิทธิ์ Firebase กับกฎความปลอดภัยของ Firebase
ระบุผู้ใช้
การตรวจสอบสิทธิ์จะระบุผู้ใช้ที่ร้องขอการเข้าถึงข้อมูลของคุณและให้ข้อมูลดังกล่าวเป็นตัวแปรที่คุณสามารถใช้ประโยชน์ได้ในกฎของคุณ ตัวแปร auth
ประกอบด้วยข้อมูลต่อไปนี้:
-
uid
: ID ผู้ใช้เฉพาะ ที่กำหนดให้กับผู้ใช้ที่ร้องขอ -
token
: แผนที่ของค่าที่รวบรวมโดยการรับรองความถูกต้อง
ตัวแปร auth.token
มีค่าต่อไปนี้:
สนาม | คำอธิบาย |
---|---|
email | ที่อยู่อีเมลที่เชื่อมโยงกับบัญชี หากมี |
email_verified | true หากผู้ใช้ยืนยันว่าตนสามารถเข้าถึงที่อยู่ email ได้ ผู้ให้บริการบางรายจะตรวจสอบที่อยู่อีเมลของตนโดยอัตโนมัติ |
phone_number | หมายเลขโทรศัพท์ที่เชื่อมโยงกับบัญชี หากมี |
name | ชื่อที่แสดงของผู้ใช้ หากตั้งค่าไว้ |
sub | UID ของ Firebase ของผู้ใช้ นี่เป็นเรื่องพิเศษภายในโครงการ |
firebase.identities | พจนานุกรมข้อมูลระบุตัวตนทั้งหมดที่เกี่ยวข้องกับบัญชีผู้ใช้นี้ ปุ่มต่างๆ ของพจนานุกรมอาจเป็นปุ่มใดๆ ต่อไปนี้: email , phone , google.com , facebook.com , github.com , twitter.com ค่าของพจนานุกรมคืออาร์เรย์ของตัวระบุที่ไม่ซ้ำกันสำหรับผู้ให้บริการข้อมูลประจำตัวแต่ละรายที่เชื่อมโยงกับบัญชี ตัวอย่างเช่น auth.token.firebase.identities["google.com"][0] มี ID ผู้ใช้ Google แรกที่เชื่อมโยงกับบัญชี |
firebase.sign_in_provider | ผู้ให้บริการลงชื่อเข้าใช้ที่ใช้ในการรับโทเค็นนี้ สามารถเป็นหนึ่งในสตริงต่อไปนี้: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com |
firebase.tenant | TenantId ที่เชื่อมโยงกับบัญชี หากมี เช่น tenant2-m6tyz |
หากคุณต้องการเพิ่มแอตทริบิวต์การตรวจสอบสิทธิ์ที่กำหนดเอง ตัวแปร auth.token
ยังมี การอ้างสิทธิ์ที่กำหนดเอง ที่คุณระบุด้วย
เมื่อผู้ใช้ที่ร้องขอการเข้าถึงไม่ได้ลงชื่อเข้าใช้ ตัวแปร auth
จะเป็น null
คุณสามารถใช้ประโยชน์จากกฎของคุณได้ เช่น หากคุณต้องการจำกัดการเข้าถึงเพื่ออ่านให้กับผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์ — auth != null
อย่างไรก็ตาม โดยทั่วไปเราแนะนำให้จำกัดการเข้าถึงการเขียนเพิ่มเติม
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวแปร auth
โปรดดูเอกสารอ้างอิงสำหรับ Cloud Firestore , Realtime Database และ Cloud Storage
ใช้ประโยชน์จากข้อมูลผู้ใช้ในกฎ
ในทางปฏิบัติ การใช้ข้อมูลที่ได้รับการรับรองความถูกต้องในกฎของคุณจะทำให้กฎของคุณมีประสิทธิภาพและยืดหยุ่นมากขึ้น คุณสามารถควบคุมการเข้าถึงข้อมูลตามข้อมูลประจำตัวของผู้ใช้ได้
ในกฎของคุณ ให้กำหนดว่าข้อมูลในตัวแปรการ auth
— ข้อมูลผู้ใช้ของผู้ร้องขอ — ตรงกับข้อมูลผู้ใช้ที่เกี่ยวข้องกับข้อมูลที่ร้องขออย่างไร
ตัวอย่างเช่น แอปของคุณอาจต้องการให้แน่ใจว่าผู้ใช้สามารถอ่านและเขียนได้เฉพาะข้อมูลของตนเองเท่านั้น ในสถานการณ์สมมตินี้ คุณจะต้องการจับคู่ระหว่างตัวแปร auth.uid
และ ID ผู้ใช้ในข้อมูลที่ร้องขอ:
คลาวด์ไฟร์สโตร์
service cloud.firestore {
match /databases/{database}/documents {
// Make sure the uid of the requesting user matches name of the user
// document. The wildcard expression {userId} makes the userId variable
// available in rules.
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}
ฐานข้อมูลเรียลไทม์
{
"rules": {
"users": {
"$userId": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($userId)
".write": "$userId === auth.uid"
}
}
}
}
การจัดเก็บเมฆ
service firebase.storage {
// Only a user can upload their file, but anyone can view it
match /users/{userId}/{fileName} {
allow read;
allow write: if request.auth != null && request.auth.uid == userId;
}
}
กำหนดข้อมูลผู้ใช้ที่กำหนดเอง
คุณสามารถใช้ประโยชน์จากตัวแปร auth
เพิ่มเติมเพื่อกำหนดฟิลด์ที่กำหนดเองซึ่งกำหนดให้กับผู้ใช้แอปของคุณ
ตัวอย่างเช่น สมมติว่าคุณต้องการสร้างบทบาท "ผู้ดูแลระบบ" ที่เปิดใช้งานการเข้าถึงการเขียนบนเส้นทางที่แน่นอน คุณจะต้องกำหนดคุณลักษณะนั้นให้กับผู้ใช้ จากนั้นจึงใช้ประโยชน์จากกฎที่ให้สิทธิ์การเข้าถึงเส้นทาง
ใน Cloud Firestore คุณสามารถเพิ่มฟิลด์ที่กำหนดเองลงในเอกสารของผู้ใช้และดึงค่าของฟิลด์นั้นด้วยการอ่านที่ฝังอยู่ในกฎของคุณ ดังนั้น กฎที่อิงตามผู้ดูแลระบบของคุณจะมีลักษณะดังตัวอย่างต่อไปนี้:
คลาวด์ไฟร์สโตร์
service cloud.firestore {
match /databases/{database}/documents/some_collection: {
// Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
write: if request.auth != null && get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin == true;
read: if request.auth != null;
}
}
คุณสามารถเข้าถึงการอ้างสิทธิ์แบบกำหนดเองได้ในกฎหลังจาก สร้างการอ้างสิทธิ์แบบกำหนดเอง ในการตรวจสอบสิทธิ์ จากนั้นคุณสามารถอ้างอิงการอ้างสิทธิ์แบบกำหนดเองเหล่านั้นได้โดยใช้ตัวแปร auth.token
คลาวด์ไฟร์สโตร์
service cloud.firestore {
match /databases/{database}/documents {
// For attribute-based access control, check for an admin claim
allow write: if request.auth.token.admin == true;
allow read: true;
// Alterntatively, for role-based access, assign specific roles to users
match /some_collection/{document} {
allow read: if request.auth.token.reader == "true";
allow write: if request.auth.token.writer == "true";
}
}
}
ฐานข้อมูลเรียลไทม์
{
"rules": {
"some_path/$sub_path": {
// Create a custom claim for the admin role
".write": "auth.uid !== null && auth.token.writer === true"
".read": "auth.uid !== null"
}
}
}
การจัดเก็บเมฆ
service firebase.storage {
// Create a custom claim for the admin role
match /files/{fileName} {
allow read: if request.auth.uid != null;
allow write: if request.auth.token.admin == true;
}
}
หากต้องการดูตัวอย่างเพิ่มเติมของกฎพื้นฐานที่ใช้ประโยชน์จากการตรวจสอบสิทธิ์ โปรดดู กฎความปลอดภัยขั้นพื้นฐาน