Bảo Mật API Tối Ưu Với Row Level Security Trong Supabase

06/03/2026 P T P Chung 9 phút đọc 0 bình luận

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);

Test chính sách

Sau khi tạo chính sách, bạn nên test để đảm bảo mọi thứ hoạt động đúng. Supabase cung cấp tính năng "Test using a role" để mô phỏng truy cập từ các vai trò khác nhau.

Ví dụ thực tế: Bảo mật bảng profiles

Giả sử bạn có bảng profiles với các cột: id, email, name, avatar_url. Bạn muốn mỗi người dùng chỉ xem và sửa thông tin của chính mình.

Đầu tiên, bật RLS cho bảng profiles. Sau đó, tạo các chính sách như sau:

Quảng cáo

300x250 In-Content Advertisement

-- Chính sách SELECT: Người dùng chỉ xem được thông tin của chính họ
CREATE POLICY "Users can view own profile"
  ON profiles
  FOR SELECT
  USING (auth.uid() = id);
-- Chính sách UPDATE: Người dùng chỉ sửa được thông tin của chính họ
CREATE POLICY "Users can update own profile"
  ON profiles
  FOR UPDATE
  USING (auth.uid() = id);
-- Chính sách INSERT: Người dùng chỉ có thể tạo profile cho chính họ
CREATE POLICY "Users can insert own profile"
  ON profiles
  FOR INSERT
  WITH CHECK (auth.uid() = id);

Với các chính sách này, khi người dùng gọi API để xem hoặc sửa profile, Supabase sẽ tự động kiểm tra và chỉ trả về dữ liệu của chính họ.

Tích hợp với API Supabase

Khi bạn gọi các hàm của Supabase Client (như from('profiles').select() hoặc from('profiles').update()), RLS sẽ được áp dụng tự động. Bạn không cần viết thêm code kiểm tra quyền ở phía client hay server.

Ví dụ với JavaScript:

// Lấy thông tin profile của người dùng hiện tại
const { data, error } = await supabase
  .from('profiles')
  .select('*')
  .eq('id', supabase.auth.user().id);

// Cập nhật thông tin profile const updates = { name: 'New Name', avatar_url: 'new-url' }; const { data, error } = await supabase .from('profiles') .update(updates) .eq('id', supabase.auth.user().id);

Mọi thứ đã được bảo mật bởi RLS, nên bạn không cần lo lắng về việc người dùng truy cập dữ liệu không hợp lệ.

Mẹo và lưu ý khi sử dụng RLS

- Luôn test chính sách với các vai trò khác nhau để đảm bảo an toàn. - Sử dụng auth.uid() để lấy ID người dùng hiện tại trong chính sách. - Nếu bạn có bảng liên quan (foreign keys), hãy cân nhắc tạo chính sách cho các bảng liên quan. - Không nên bật RLS cho các bảng public (như bảng config) nếu không cần thiết. - Khi debug, tắt tạm thời RLS để kiểm tra dữ liệu, nhưng nhớ bật lại trước khi deploy.

Kết luận

Row Level Security trong Supabase giúp bạn bảo vệ dữ liệu một cách tự động và hiệu quả. Thay vì phải kiểm tra quyền thủ công trong code, bạn chỉ cần định nghĩa chính sách một lần và Supabase sẽ đảm bảo mọi truy cập đều tuân thủ quy tắc. Điều này giúp giảm thiểu lỗi bảo mật và tiết kiệm thời gian phát triển.

Hãy bắt đầu áp dụng RLS cho các bảng nhạy cảm trong ứng dụng của bạn, và luôn test kỹ trước khi đưa vào production. Nếu bạn có thắc mắc hoặc kinh nghiệm hay về RLS, hãy chia sẻ ở phần bình luận bên dưới!

Quảng cáo

728x90 Bottom Advertisement

Thay thế bằng mã Google AdSense

Chia sẻ bài viết

Facebook Twitter

Bình luận

Chia sẻ ý kiến của bạn về bài viết này

Viết bình luận

Bình luận của bạn sẽ được kiểm duyệt trước khi hiển thị

Chưa có bình luận nào

Hãy là người đầu tiên bình luận về bài viết này!