Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Các quy tắc bảo mật cơ bản

Quy tắc bảo mật của Firebase cho phép bạn kiểm soát quyền truy cập vào dữ liệu được lưu trữ của mình. Cú pháp các quy tắc linh hoạt có nghĩa là bạn có thể tạo các quy tắc phù hợp với bất kỳ thứ gì, từ tất cả các lần ghi vào toàn bộ cơ sở dữ liệu đến các hoạt động trên một tài liệu cụ thể.

Hướng dẫn này mô tả một số trường hợp sử dụng cơ bản hơn mà bạn có thể muốn triển khai khi thiết lập ứng dụng và bảo vệ dữ liệu của mình. Tuy nhiên, trước khi bạn bắt đầu viết quy tắc, bạn có thể muốn tìm hiểu thêm về ngôn ngữ họ đang viết bằng và họ hành vi .

Để truy cập và cập nhật quy tắc của bạn, hãy làm theo các bước được nêu trong Quản lý và triển khai Quy định an toàn căn cứ hỏa lực .

Quy tắc mặc định: Chế độ đã khóa

Khi bạn tạo một đối tượng cơ sở dữ liệu hoặc lưu trữ trong các căn cứ hỏa lực điều khiển, bạn chọn xem Quy định an toàn căn cứ hỏa lực của bạn hạn chế quyền truy cập vào dữ liệu của bạn (Locked mode) hoặc cho phép truy cập bất cứ ai (chế độ Test). Cloud FireStore và Cơ sở dữ liệu thời gian thực, các quy tắc mặc định cho chế độ khóa từ chối truy cập đến tất cả người dùng. Trong Cloud Storage, chỉ những người dùng đã xác thực mới có thể truy cập vào các nhóm lưu trữ.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Cơ sở dữ liệu thời gian thực

{
  "rules": {
    ".read": false,
    ".write": false
  }
}

Lưu trữ đám mây

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Quy tắc môi trường-phát triển

Trong khi làm việc trên ứng dụng của mình, bạn có thể muốn có quyền truy cập tương đối mở hoặc không bị kiểm soát vào dữ liệu của mình. Chỉ cần đảm bảo cập nhật Quy tắc của bạn trước khi bạn triển khai ứng dụng của mình vào phiên bản sản xuất. Cũng nên nhớ rằng nếu bạn triển khai ứng dụng của bạn, nó có thể truy cập công khai - ngay cả khi bạn chưa tung ra nó.

Hãy nhớ rằng Firebase cho phép khách hàng truy cập trực tiếp vào dữ liệu của bạn và Quy tắc bảo mật của Firebase là biện pháp bảo vệ duy nhất để chặn quyền truy cập dành cho người dùng độc hại. Việc xác định các quy tắc tách biệt với logic sản phẩm có một số lợi thế: khách hàng không chịu trách nhiệm thực thi bảo mật, việc triển khai lỗi sẽ không ảnh hưởng đến dữ liệu của bạn và quan trọng nhất, bạn không dựa vào máy chủ trung gian để bảo vệ dữ liệu khỏi thế giới.

Tất cả người dùng đã xác thực

Mặc dù chúng tôi không khuyên bạn nên để bất kỳ người dùng nào đã đăng nhập có thể truy cập dữ liệu của mình, nhưng có thể hữu ích khi đặt quyền truy cập cho bất kỳ người dùng đã xác thực nào trong khi bạn đang phát triển ứng dụng của mình.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Cơ sở dữ liệu thời gian thực

{
  "rules": {
    ".read": "auth.uid != null",
    ".write": "auth.uid != null"
  }
}

Lưu trữ đám mây

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Quy tắc sẵn sàng sản xuất

Khi bạn chuẩn bị triển khai ứng dụng của mình, hãy đảm bảo dữ liệu của bạn được bảo vệ và quyền truy cập được cấp đúng cách cho người dùng của bạn. Đòn bẩy xác thực để thiết lập truy cập dựa trên người dùng và đọc trực tiếp từ cơ sở dữ liệu của bạn để thiết lập dựa trên dữ liệu truy cập.

Cân nhắc viết quy tắc khi bạn cấu trúc dữ liệu của mình, vì cách bạn thiết lập quy tắc ảnh hưởng đến cách bạn hạn chế quyền truy cập vào dữ liệu ở các đường dẫn khác nhau.

Quyền truy cập chỉ chủ sở hữu nội dung

Các quy tắc này chỉ hạn chế quyền truy cập đối với chủ sở hữu đã xác thực của nội dung. Dữ liệu chỉ có thể đọc và ghi bởi một người dùng và đường dẫn dữ liệu chứa ID của người dùng.

Khi quy định này công trình: Quy tắc này hoạt động tốt nếu dữ liệu được bưng bít của thành viên - nếu người dùng duy nhất nhu cầu truy cập dữ liệu là cùng một người dùng đã tạo ra dữ liệu.

Khi quy định này không làm việc: ruleset này không hoạt động khi nhiều người dùng cần phải ghi hoặc đọc các dữ liệu giống nhau - người dùng sẽ ghi đè lên dữ liệu hoặc không thể truy cập dữ liệu mà họ đã tạo ra.

Để thiết lập quy tắc này: Tạo một quy tắc xác nhận người sử dụng yêu cầu truy cập để đọc hoặc ghi dữ liệu là sử dụng sở hữu dữ liệu đó.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{userId}/{documents=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId
    }
  }
}

Cơ sở dữ liệu thời gian thực

{
  "rules": {
    "some_path": {
      "$uid": {
        // Allow only authenticated content owners access to their data
        ".read": "auth != null && auth.uid == $uid"
        ".write": "auth != null && auth.uid == $uid"
      }
    }
  }
}

Lưu trữ đám mây

// Grants a user access to a node matching their user ID
service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

Quyền truy cập công cộng và riêng tư hỗn hợp

Quy tắc này cho phép mọi người đọc một tập dữ liệu, nhưng hạn chế khả năng tạo hoặc sửa đổi dữ liệu tại một đường dẫn nhất định chỉ cho chủ sở hữu nội dung đã xác thực.

Khi quy tắc này hoạt động: Quy tắc này hoạt động tốt cho các ứng dụng đòi hỏi phải công khai các yếu tố có thể đọc được, nhưng cần thiết phải hạn chế truy cập chỉnh sửa cho chủ sở hữu những yếu tố. Ví dụ, một ứng dụng trò chuyện hoặc blog.

Khi quy định này không làm việc: Giống như các nội dung chủ sở hữu duy nhất quy tắc, ruleset này không hoạt động khi nhiều người dùng cần phải chỉnh sửa cùng một dữ liệu. Người dùng cuối cùng sẽ ghi đè dữ liệu của nhau.

Để thiết lập quy tắc này: Tạo một quy tắc cho phép truy cập đọc cho tất cả người dùng (hoặc tất cả người dùng chứng thực), và xác nhận dữ liệu người dùng viết là chủ sở hữu.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow create: if request.auth.uid == request.resource.data.author_uid;
      allow update, delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}

Cơ sở dữ liệu thời gian thực

{
// Allow anyone to read data, but only authenticated content owners can
// make changes to their data

  "rules": {
    "some_path": {
      "$uid": {
        ".read": true,
        // or ".read": "auth.uid != null" for only authenticated users
        ".write": "auth.uid == $uid"
      }
    }
  }
}

Lưu trữ đám mây

service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read;
      allow write: if request.auth.uid == userId;
    }
  }
}

Quyền truy cập dựa trên thuộc tính và dựa trên vai trò

Để các quy tắc này hoạt động, bạn phải xác định và gán các thuộc tính cho người dùng trong dữ liệu của mình. Quy tắc bảo mật của Firebase kiểm tra yêu cầu đối với dữ liệu từ cơ sở dữ liệu của bạn hoặc siêu dữ liệu của tệp để xác nhận hoặc từ chối quyền truy cập.

Khi quy tắc này hoạt động: Nếu bạn đang gán vai trò cho người sử dụng, quy tắc này làm cho nó dễ dàng để truy cập giới hạn dựa trên vai trò hoặc nhóm cụ thể của người sử dụng. Ví dụ: nếu bạn đang lưu trữ điểm, bạn có thể chỉ định các cấp độ truy cập khác nhau cho nhóm "sinh viên" (chỉ đọc nội dung của họ), nhóm "giáo viên" (đọc và viết trong chủ đề của họ) và nhóm "hiệu trưởng" (đọc tất cả nội dung).

Khi quy định này không làm việc: Cơ sở dữ liệu trong thời gian thực và Cloud Storage, quy tắc của bạn không thể tận dụng get() phương pháp mà quy tắc của Cloud FireStore có thể kết hợp. Do đó, bạn phải cấu trúc cơ sở dữ liệu hoặc siêu dữ liệu tệp của mình để phản ánh các thuộc tính bạn đang sử dụng trong các quy tắc của mình.

Để thiết lập quy tắc này: Trong đám mây FireStore, bao gồm một lĩnh vực trong các tài liệu của người dùng mà bạn có thể đọc, sau đó cấu trúc quy tắc của bạn đọc lĩnh vực đó và có điều kiện cấp quyền truy cập. Trong Cơ sở dữ liệu thời gian thực, hãy tạo một đường dẫn dữ liệu xác định người dùng ứng dụng của bạn và cấp cho họ vai trò trong một nút con.

Bạn cũng có thể thiết lập yêu cầu tùy chỉnh trong xác thực và sau đó lấy thông tin từ auth.token biến trong bất kỳ Quy định an toàn căn cứ hỏa lực.

Các thuộc tính và vai trò do dữ liệu xác định

Các quy tắc này chỉ hoạt động trong Cloud Firestore và Cơ sở dữ liệu thời gian thực.

Cloud Firestore

Hãy nhớ rằng bất kỳ khi nào các quy tắc của bạn có nội dung đã đọc, như các quy tắc bên dưới, bạn sẽ được lập hóa đơn cho một thao tác đọc trong Cloud Firestore.

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, Check a boolean `admin` attribute
    allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"
   }
  }
}

Cơ sở dữ liệu thời gian thực

{
  "rules": {
    "some_path": {
      "${subpath}": {
        //
        ".write": "root.child('users').child(auth.uid).child('role').val() == 'admin'",
        ".read": true
      }
    }
  }
}

Thuộc tính và vai trò xác nhận quyền sở hữu

Để thực hiện các quy định này, thiết lập yêu cầu tùy chỉnh trong căn cứ hỏa lực xác thực và sau đó tận dụng những tuyên bố trong các quy tắc của bạn.

Cloud Firestore

Hãy nhớ rằng bất kỳ khi nào các quy tắc của bạn có nội dung đã đọc, giống như các quy tắc bên dưới, bạn sẽ được lập hóa đơn cho một thao tác đọc trong Cloud Firestore.

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";
   }
  }
}

Cơ sở dữ liệu thời gian thực

{
  "rules": {
    "some_path": {
      "$uid": {
        // Create a custom claim for each role or group
        // you want to leverage
        ".write": "auth.uid != null && auth.token.writer == true",
        ".read": "auth.uid != null && auth.token.reader == true"
      }
    }
  }
}

Lưu trữ đám mây

service firebase.storage {
  // Allow reads if the group ID in your token matches the file metadata's `owner` property
  // Allow writes if the group ID is in the user's custom token
  match /files/{groupId}/{fileName} {
    allow read: if resource.metadata.owner == request.auth.token.groupId;
    allow write: if request.auth.token.groupId == groupId;
  }
}