Giới thiệu
Khi xây dựng các ứng dụng web hoặc mobile hiện đại, việc quản lý quyền truy cập dữ liệu ở mức độ dòng (row) trở nên rất quan trọng. Bạn không muốn người dùng nhìn thấy thông tin của người khác, và cũng không muốn mỗi API phải tự kiểm tra quyền một cách thủ công. Row Level Security (RLS) trong Supabase giúp bạn giải quyết vấn đề này một cách tự động và an toàn. Trong bài viết này, chúng ta sẽ tìm hiểu cách bảo mật API với RLS, từ khái niệm cơ bản đến các ví dụ thực tế.
Row Level Security là gì?
Row Level Security (RLS) là tính năng của PostgreSQL cho phép bạn kiểm soát quyền truy cập dữ liệu ở mức độ từng dòng trong bảng. Thay vì chỉ giới hạn quyền ở mức bảng (như SELECT, INSERT, UPDATE, DELETE), RLS cho phép bạn xác định chính sách truy cập riêng cho từng người dùng, dựa trên các điều kiện cụ thể.
Ví dụ: Trong bảng profiles, người dùng chỉ được xem và sửa thông tin của chính mình. Hay trong bảng orders, nhân viên chỉ được xem đơn hàng thuộc khu vực mình phụ trách. Điều này giúp đảm bảo dữ liệu nhạy cảm không bị lộ ra ngoài.
Cách hoạt động của RLS trong Supabase
Supabase dựa trên PostgreSQL, nên hỗ trợ RLS một cách đầy đủ. Khi bạn bật RLS cho một bảng, mọi truy vấn (query) đến bảng đó sẽ được kiểm tra bởi các chính sách (policies) bạn đã định nghĩa. Nếu không có chính sách phù hợp, truy vấn sẽ bị từ chối.
Supabase cung cấp giao diện web để tạo và quản lý các chính sách một cách trực quan. Bạn có thể viết chính sách bằng SQL hoặc sử dụng trình tạo policy của Supabase. Mỗi chính sách được gắn với một vai trò (role), và Supabase tự động quản lý vai trò cho người dùng đã xác thực.
Các bước thiết lập RLS trong Supabase
Bật RLS cho bảng
Để bắt đầu, bạn cần bật RLS cho bảng bạn muốn bảo mật. Trong Dashboard của Supabase, chọn bảng, vào tab “Policies”, và nhấn “Enable RLS”. Lúc này, mọi truy cập vào bảng sẽ yêu cầu chính sách cho phép.
Tạo chính sách
Sau khi bật RLS, bạn cần tạo các chính sách. Ví dụ, với bảng profiles, bạn muốn mỗi người dùng chỉ xem và sửa thông tin của mình:
-- Tạo policy cho phép người dùng xem thông tin của chính họ
CREATE POLICY "Users can view own profile"
ON profiles
FOR SELECT
USING (auth.uid() = id);-- Tạo policy cho phép người dùng sửa thông tin của chính họ
CREATE POLICY "Users can update own profile"
ON profiles
FOR UPDATE
USING (auth.uid() = id);