Hiểu các quy tắc cơ sở dữ liệu thời gian thực của Firebase

Quy tắc bảo mật cơ sở dữ liệu thời gian thực của Firebase xác định ai đã đọc và ghi quyền truy cập vào cơ sở dữ liệu của bạn, cách dữ liệu của bạn được cấu trúc và những chỉ mục nào tồn tại. Các quy tắc này tồn tại trên máy chủ Firebase và được thực thi tự động mọi lúc. Mọi yêu cầu đọc và ghi sẽ chỉ được hoàn thành nếu các quy tắc của bạn cho phép. Theo mặc định, các quy tắc của bạn không cho phép bất kỳ ai truy cập vào cơ sở dữ liệu của bạn. Điều này là để bảo vệ cơ sở dữ liệu của bạn khỏi bị lạm dụng cho đến khi bạn có thời gian để tùy chỉnh các quy tắc của mình hoặc thiết lập xác thực.

Quy tắc bảo mật cơ sở dữ liệu thời gian thực có cú pháp giống JavaScript và có bốn loại:

Các loại quy tắc
.đọc Mô tả nếu và khi nào dữ liệu được phép đọc bởi người dùng.
.viết Mô tả nếu và khi nào dữ liệu được phép ghi.
.validate Xác định giá trị được định dạng đúng sẽ trông như thế nào, cho dù nó có thuộc tính con và kiểu dữ liệu.
.indexOn Chỉ định một phần tử con để lập chỉ mục để hỗ trợ đặt hàng và truy vấn.

Tổng quan về bảo mật Cơ sở dữ liệu thời gian thực

Cơ sở dữ liệu thời gian thực của Firebase cung cấp một bộ công cụ đầy đủ để quản lý bảo mật cho ứng dụng của bạn. Các công cụ này giúp bạn dễ dàng xác thực người dùng, thực thi quyền của người dùng và xác thực thông tin đầu vào.

Các ứng dụng do Firebase cung cấp chạy nhiều mã phía máy khách hơn so với các ứng dụng có nhiều ngăn xếp công nghệ khác. Do đó, cách chúng tôi tiếp cận vấn đề bảo mật có thể hơi khác so với những gì bạn đã quen.

Xác thực

Bước đầu tiên phổ biến trong việc bảo mật ứng dụng của bạn là xác định người dùng của bạn. Quá trình này được gọi là xác thực . Bạn có thể sử dụng Xác thực Firebase để yêu cầu người dùng đăng nhập vào ứng dụng của bạn. Xác thực Firebase bao gồm hỗ trợ thả vào cho các phương pháp xác thực phổ biến như Google và Facebook, cũng như đăng nhập bằng email và mật khẩu, đăng nhập ẩn danh, v.v.

Danh tính người dùng là một khái niệm bảo mật quan trọng. Những người dùng khác nhau có dữ liệu khác nhau và đôi khi họ có các khả năng khác nhau. Ví dụ: trong một ứng dụng trò chuyện, mỗi tin nhắn được liên kết với người dùng đã tạo nó. Người dùng cũng có thể xóa tin nhắn của chính họ, nhưng không xóa được tin nhắn do người dùng khác đăng.

Ủy quyền

Xác định người dùng của bạn chỉ là một phần của bảo mật. Khi bạn biết họ là ai, bạn cần có cách để kiểm soát quyền truy cập của họ vào dữ liệu trong cơ sở dữ liệu của bạn. Quy tắc bảo mật cơ sở dữ liệu thời gian thực cho phép bạn kiểm soát quyền truy cập cho từng người dùng. Ví dụ: đây là một tập hợp các quy tắc bảo mật cho phép mọi người đọc đường dẫn /foo/ , nhưng không ai ghi vào đó:

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

Các quy tắc .write .read tầng, do đó, bộ quy tắc này cấp quyền truy cập đọc vào bất kỳ dữ liệu nào tại đường dẫn /foo/ cũng như bất kỳ đường dẫn sâu hơn nào như /foo/bar/baz . Lưu ý rằng các quy tắc .write .read nhanh hơn trong cơ sở dữ liệu sẽ ghi đè các quy tắc sâu hơn, vì vậy quyền truy cập đọc vào /foo/bar/baz sẽ vẫn được cấp trong ví dụ này ngay cả khi một quy tắc tại đường dẫn /foo/bar/baz được đánh giá là false.

Quy tắc bảo mật cơ sở dữ liệu thời gian thực bao gồm các biến và chức năng được tích hợp sẵn cho phép bạn tham chiếu đến các đường dẫn khác, dấu thời gian phía máy chủ, thông tin xác thực và hơn thế nữa. Dưới đây là ví dụ về quy tắc cấp quyền ghi cho người dùng đã xác thực vào /users/<uid>/ , trong đó <uid> là ID của người dùng có được thông qua Xác thực Firebase.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Xác nhận dữ liệu

Cơ sở dữ liệu thời gian thực của Firebase là không có cơ sở dữ liệu. Điều này giúp bạn dễ dàng thay đổi mọi thứ khi phát triển, nhưng khi ứng dụng của bạn đã sẵn sàng để phân phối, điều quan trọng là dữ liệu phải nhất quán. Ngôn ngữ quy tắc bao gồm quy tắc .validate cho phép bạn áp dụng logic xác thực bằng cách sử dụng cùng các biểu thức được sử dụng cho quy tắc .write.read . Sự khác biệt duy nhất là các quy tắc xác thực không phân tầng , vì vậy tất cả các quy tắc xác thực có liên quan phải đánh giá thành true để cho phép ghi.

Quy tắc này thực thi rằng dữ liệu được ghi vào /foo/ phải là một chuỗi nhỏ hơn 100 ký tự:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

Quy tắc xác thực có quyền truy cập vào tất cả các hàm và biến tích hợp giống như quy tắc .write .read Bạn có thể sử dụng các quy tắc này để tạo các quy tắc xác thực nhận biết dữ liệu ở những nơi khác trong cơ sở dữ liệu, danh tính người dùng, thời gian máy chủ của bạn và hơn thế nữa.

Xác định chỉ mục cơ sở dữ liệu

Cơ sở dữ liệu thời gian thực của Firebase cho phép đặt hàng và truy vấn dữ liệu. Đối với kích thước dữ liệu nhỏ, cơ sở dữ liệu hỗ trợ truy vấn đặc biệt, do đó, chỉ mục thường không được yêu cầu trong quá trình phát triển. Tuy nhiên, trước khi khởi chạy ứng dụng của bạn, điều quan trọng là phải chỉ định các chỉ mục cho bất kỳ truy vấn nào bạn có để đảm bảo chúng tiếp tục hoạt động khi ứng dụng của bạn phát triển.

Chỉ mục được chỉ định bằng cách sử dụng quy tắc .indexOn . Đây là một khai báo chỉ mục ví dụ sẽ lập chỉ mục các trường chiều cao và chiều dài cho danh sách các loài khủng long:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Bước tiếp theo