Các quy tắc bảo mật của Cơ sở dữ liệu thời gian thực Firebase xác định những người có quyền đọc và ghi 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 hiện có. Các quy tắc này nằm trên máy chủ Firebase và luôn được thực thi tự động. Mọi yêu cầu đọc và ghi sẽ chỉ được hoàn tất 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. Việc này nhằm bảo vệ cơ sở dữ liệu của bạn khỏi hành vi sai trái cho đến khi bạn có thời gian tuỳ chỉnh các quy tắc hoặc thiết lập quy trình xác thực.
Các quy tắc bảo mật của Realtime Database có cú pháp tương tự như JavaScript và có 4 loại:
Các loại quy tắc | |
---|---|
.read | Mô tả việc người dùng có được phép đọc dữ liệu hay không và thời điểm được phép đọc dữ liệu. |
.write | Mô tả việc có được phép ghi dữ liệu hay không và thời điểm được phép ghi dữ liệu. |
.validate | Xác định giá trị có định dạng chính xác sẽ trông như thế nào, liệu giá trị đó có thuộc tính con hay không và kiểu dữ liệu. |
.indexOn | Chỉ định một thành phần con để lập chỉ mục nhằm hỗ trợ việc sắp xếp và truy vấn. |
Realtime Database tổng quan về bảo mật
Firebase Realtime Database cung cấp một bộ công cụ đầy đủ để quản lý tính bảo mật của ứng dụng. 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 người dùng và xác thực dữ liệu đầu vào.
Các ứng dụng dựa trên Firebase chạy nhiều mã phía máy khách hơn so với những ứ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 thuộc.
Xác thực
Bước đầu tiên thường thấy trong việc bảo mật ứng dụng là xác định người dùng. 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 để cho phép người dùng đăng nhập vào ứng dụng của bạn. Xác thực Firebase hỗ trợ sẵn các phương thức 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. Mỗi người dùng có dữ liệu riêng và đôi khi họ có những khả năng khác nhau. Ví dụ: trong một ứng dụng trò chuyện, mỗi thông báo đều được liên kết với người dùng đã tạo thông báo đó. Người dùng cũng có thể xoá tin nhắn của chính mình, nhưng không thể xoá tin nhắn do người dùng khác đăng.
Ủy quyền
Việc xác định người dùng chỉ là một phần của bảo mật. Sau khi biết danh tính của họ, 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ủa Cơ sở dữ liệu thời gian thực cho phép bạn kiểm soát quyền truy cập của từng người dùng. Ví dụ: sau đây là một bộ quy tắc bảo mật cho phép mọi người đọc đường dẫn /foo/
, nhưng không cho phép ai ghi vào đường dẫn đó:
{ "rules": { "foo": { ".read": true, ".write": false } } }
Các quy tắc .read
và .write
sẽ xếp tầng, vì vậy, bộ quy tắc này cấp quyền đọc cho mọi dữ liệu tại đường dẫn /foo/
cũng như mọi đường dẫn sâu hơn, chẳng hạn như /foo/bar/baz
. Xin lưu ý rằng các quy tắc .read
và .write
nông hơn trong cơ sở dữ liệu sẽ ghi đè các quy tắc sâu hơn, vì vậy, quyền đọc đối với /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
được đánh giá là sai.
Các Quy tắc bảo mật của Realtime Database bao gồm các biến và hàm tích hợp 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à nhiều thông tin khác.
Dưới đây là ví dụ về một quy tắc cấp quyền ghi cho người dùng đã xác thực vào /users/<uid>/
, trong đó <uid> là mã nhận dạng của người dùng nhận được thông qua Firebase Authentication.
{ "rules": { "users": { "$uid": { ".write": "$uid === auth.uid" } } } }
Xác thực dữ liệu
Firebase Realtime Database không có lược đồ. Điều này giúp bạn dễ dàng thay đổi mọi thứ trong quá trình 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
. Quy tắc này cho phép bạn áp dụng logic xác thực bằng cách sử dụng các biểu thức tương tự như biểu thức được dùng cho các quy tắc .read
và .write
. Điểm khác biệt duy nhất là các quy tắc xác thực không xếp 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á là đúng thì mới được phép ghi.
Các 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 có ít hơn 100 ký tự:
{ "rules": { "foo": { ".validate": "newData.isString() && newData.val().length < 100" } } }
Các 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 .read
và .write
. Bạn có thể sử dụng các quy tắc này để tạo quy tắc xác thực nhận biết dữ liệu ở nơi khác trong cơ sở dữ liệu, danh tính người dùng, thời gian máy chủ và nhiều thông tin khác.
Xác định chỉ mục cơ sở dữ liệu
Firebase Realtime Database cho phép sắp xếp và truy vấn dữ liệu. Đối với các kích thước dữ liệu nhỏ, cơ sở dữ liệu hỗ trợ truy vấn đặc biệt, vì vậy, thường không cần chỉ mục trong quá trình phát triển. Tuy nhiên, trước khi chạy ứng dụng, bạn cần chỉ định các chỉ mục cho mọi truy vấn để đả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 quy tắc .indexOn
. Sau đây là ví dụ về một khai báo chỉ mục sẽ lập chỉ mục các trường chiều cao và chiều dài cho danh sách khủng long:
{ "rules": { "dinosaurs": { ".indexOn": ["height", "length"] } } }
Các bước tiếp theo
- Bắt đầu phát triển các quy tắc lập kế hoạch cho cơ sở dữ liệu của bạn.
- Tìm hiểu thêm về cách bảo mật dữ liệu bằng các quy tắc bảo mật.
- Tìm hiểu thêm về cách chỉ định chỉ mục bằng quy tắc.