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.
.write 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ó các thuộc tính con và kiểu dữ liệu.
.indexOn Chỉ định mộ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. Những 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 người dùng và xác thực đầ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 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 đã từng làm.

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 căn cứ hỏa lực xác thực để có 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 bất cứ ai để đọc con đường /foo/ , nhưng không ai viết thư cho nó:

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

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

Cơ sở dữ liệu Security Rules Realtime bao gồm các biến tích hợp và chức năng cho phép bạn tham khảo đường dẫn khác, timestamps server-side, thông tin xác thực, và nhiều hơn nữa. Dưới đây là một ví dụ về một quy tắc tài trợ viết truy cập cho người dùng xác thực để /users/<uid>/ , trong đó <uid> là ID của người dùng được thông qua căn cứ hỏa lực xác thực.

{
  "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 một .validate quy tắc cho phép bạn áp dụng logic xác nhận sử dụng các từ ngữ được sử dụng cho .read.write quy tắc. Sự khác biệt duy nhất là quy tắc xác nhận không thác, vì vậy tất cả quy tắc xác nhận có liên quan phải đánh giá là true để cho ghi vào được cho phép.

Những quy tắc thực thi dữ liệu ghi vào /foo/ phải là một chuỗi ít hơn 100 ký tự:

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

Validation quy tắc có quyền truy cập vào tất cả các giống built-in chức năng và các biến như .read.write quy tắc. 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. 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ỉ số được quy định bằng cách sử dụng .indexOn quy tắc. Đâ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