Supabase Row Level Security: Bảo mật dữ liệu từng hàng hiệu quả

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

Supabase Row Level Security (RLS): Bảo mật dữ liệu từng hàng

Trong thế giới ứng dụng hiện đại, bảo mật dữ liệu không chỉ là một tính năng - đó là một yêu cầu bắt buộc. Khi xây dựng các ứng dụng web hoặc di động, chúng ta thường phải đối mặt với tình huống: làm thế nào để đảm bảo người dùng chỉ có thể truy cập vào dữ liệu mà họ được phép xem? Đây chính là lúc Row Level Security (RLS) của Supabase phát huy tác dụng.

1. Row Level Security (RLS) là gì?

Row Level Security là một tính năng bảo mật cho phép bạn kiểm soát quyền truy cập dữ liệu ở cấp độ từng hàng trong bảng. Thay vì cho phép người dùng truy cập toàn bộ bảng, RLS đảm bảo rằng mỗi người dùng chỉ có thể thấy những hàng dữ liệu mà họ được phép xem.

Ví dụ, trong một ứng dụng quản lý nhân sự, nhân viên chỉ nên thấy thông tin của chính họ, trong khi quản lý có thể thấy thông tin của cả team. RLS giúp thực hiện điều này một cách tự động và an toàn.

2. Tại sao cần sử dụng RLS?

Nếu không có RLS, bạn sẽ phải xử lý bảo mật ở tầng ứng dụng, điều này dẫn đến:

- Hiệu năng kém: Mỗi lần truy vấn, bạn phải lọc dữ liệu ở phía client. - Rủi ro bảo mật cao: Nếu ai đó vượt qua được tầng ứng dụng, họ có thể truy cập toàn bộ dữ liệu. - Code phức tạp: Bạn phải viết logic bảo mật lặp đi lặp lại ở nhiều nơi.

Với RLS, bảo mật được xử lý trực tiếp ở cơ sở dữ liệu, giúp code sạch hơn, an toàn hơn và hiệu năng tốt hơn.

3. Cách hoạt động của RLS trong Supabase

Supabase sử dụng PostgreSQL làm cơ sở dữ liệu, và RLS được hỗ trợ một cách bản địa. Khi bạn bật RLS cho một bảng, mặc định mọi truy vấn sẽ bị chặn. Bạn cần tạo các policy (chính sách) để định nghĩa ai được truy cập dữ liệu nào.

Các bước cơ bản để thiết lập RLS:

1. Bật RLS cho bảng:

ALTER TABLE users ENABLE ROW LEVEL SECURITY;

2. Tạo policy:

CREATE POLICY "Users can view own profile"
   ON users
   FOR SELECT
   USING (auth.uid() = id);

Policy này có nghĩa: "Người dùng chỉ có thể xem hàng dữ liệu nếu ID của họ trùng với ID trong hàng".

3. Áp dụng cho các thao tác khác: Bạn có thể tạo policy cho INSERT, UPDATE, DELETE tương ứng.

Quảng cáo

300x250 In-Content Advertisement

4. Ví dụ thực tế: Ứng dụng quản lý dự án

Giả sử bạn có bảng projectstasks:

-- Bảng projects
id | name | owner_id

-- Bảng tasks id | project_id | description | assignee_id

Policy cho projects:
CREATE POLICY "Users can view own projects"
ON projects
FOR SELECT
USING (auth.uid() = owner_id);
Policy cho tasks:
CREATE POLICY "Users can view own tasks"
ON tasks
FOR SELECT
USING (auth.uid() = assignee_id);

Như vậy, mỗi người dùng chỉ thấy dự án và task mà họ sở hữu hoặc được giao.

5. Mẹo hay khi sử dụng RLS

- Dùng auth.uid(): Hàm này trả về ID của người dùng hiện tại, rất tiện lợi. - Kết hợp với auth.role(): Nếu bạn có nhiều vai trò (admin, manager, user), có thể phân quyền chi tiết hơn. - Test policy kỹ lưỡng: Dùng Supabase Studio để test policy trước khi deploy. - Document policy rõ ràng: Giúp team hiểu logic bảo mật.

6. Lưu ý quan trọng

- RLS không thay thế authentication: Bạn vẫn cần xác thực người dùng trước khi áp dụng RLS. - Cẩn thận với public data: Nếu một hàng dữ liệu nên public, hãy tạo policy riêng cho trường hợp này. - Performance tuning: Dùng index hợp lý để policy không làm chậm truy vấn.

7. Kết luận

Row Level Security của Supabase là một công cụ mạnh mẽ giúp bạn bảo vệ dữ liệu một cách tự động và hiệu quả. Thay vì phải lo lắng về việc lọc dữ liệu ở mọi ngóc ngách của ứng dụng, bạn có thể yên tâm giao việc này cho cơ sở dữ liệu.

Bằng cách kết hợp RLS với authentication và authorization, bạn sẽ xây dựng được những ứng dụng vừa mạnh mẽ vừa an toàn, mang lại trải nghiệm tốt nhất cho người dùng.

Bạn đã sẵn sàng áp dụng RLS vào dự án của mình chưa? Hãy bắt đầu từ những policy đơn giản và nâng cấp dần khi ứng dụng phát triển!

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!