Bảo mật dữ liệu cấp hàng trong Supabase với Row Level Security

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

Mở đầu

Khi ứng dụng web ngày càng phổ biến, nhu cầu bảo vệ dữ liệu ở cấp độ dòng (row) trở thành yêu cầu bắt buộc thay vì lựa chọn. Một người dùng chỉ nên nhìn thấy những thông tin họ được phép xem, và một nhân viên chỉ được phép thay đổi bản ghi liên quan đến mình. Đây chính là lúc Row Level Security (RLS) trong Supabase phát huy tác dụng. RLS cho phép bạn kiểm soát truy cập dữ liệu một cách tinh tế ngay bên trong PostgreSQL, đảm bảo rằng mỗi truy vấn SQL đều tuân theo chính sách bảo mật đã định sẵn.

Row Level Security (RLS) là gì?

Row Level Security là tính năng của PostgreSQL cho phép bạn định nghĩa các policy (chính sách) để giới hạn truy cập dữ liệu ở cấp độ dòng. Thay vì kiểm soát quyền ở cấp độ bảng, RLS cho phép bạn chỉ định "ai được xem/sửa/xóa dòng nào". Điều này giúp bảo mật dữ liệu hiệu quả hơn, đặc biệt trong các ứng dụng nhiều người dùng hoặc nhiều vai trò.

Supabase tích hợp sẵn RLS và cung cấp giao diện web để quản lý policy một cách trực quan. Bạn có thể bật/tắt RLS cho từng bảng, viết policy bằng SQL hoặc dùng trình hướng dẫn, và theo dõi hiệu quả của các chính sách đã áp dụng.

Bật và cấu hình RLS trong Supabase

Bật RLS cho một bảng

Để bật RLS, bạn truy cập vào bảng cần bảo mật trong phần Table Editor của Supabase Dashboard. Tại tab Policies, bạn chọn Enable RLS. Lưu ý: khi RLS được bật, mặc định tất cả truy cập đều bị từ chối trừ khi có policy cho phép.

Viết policy bằng SQL

Policy trong PostgreSQL có cú pháp:

CREATE POLICY policy_name ON table_name
    FOR { ALL | SELECT | INSERT | UPDATE | DELETE }
    [ TO role_name ]
    [ USING ( condition ) ]
    [ WITH CHECK ( condition ) ];

Ví dụ, policy cho phép người dùng chỉ xem và sửa bản ghi của chính họ:

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

-- Cho phép người dùng cập nhật thông tin của chính họ CREATE POLICY "Users can update own profile" ON profiles FOR UPDATE USING ( auth.uid() = id ) WITH CHECK ( auth.uid() = id );

Viết policy qua giao diện Supabase

Supabase cung cấp trình hướng dẫn tạo policy trực quan. Bạn chọn bảng, loại truy vấn (SELECT, INSERT, UPDATE, DELETE), và điều kiện áp dụng. Ví dụ, với bảng profiles, bạn có thể chọn "Using" là auth.uid() = id để đảm bảo chỉ người dùng đăng nhập mới xem/sửa được dữ liệu của họ.

Ví dụ thực tế: Quản lý hồ sơ người dùng

Giả sử bạn có bảng profiles lưu thông tin người dùng:

Quảng cáo

300x250 In-Content Advertisement

-- profiles table
id (UUID) | name (text) | email (text) | updated_at (timestamptz)

Bạn muốn: - Người dùng chỉ xem/sửa hồ sơ của chính họ. - Admin xem/sửa mọi hồ sơ.

Policy cho người dùng thường:
-- SELECT
CREATE POLICY "Users can view own profile"
ON profiles
FOR SELECT
USING ( auth.uid() = id );

-- UPDATE CREATE POLICY "Users can update own profile" ON profiles FOR UPDATE USING ( auth.uid() = id ) WITH CHECK ( auth.uid() = id );

Policy cho admin:
-- SELECT cho admin
CREATE POLICY "Admins can view all profiles"
ON profiles
FOR SELECT
TO authenticated
USING ( auth.role() = 'admin' OR auth.uid() = id );

-- UPDATE cho admin CREATE POLICY "Admins can update any profile" ON profiles FOR UPDATE TO authenticated USING ( auth.role() = 'admin' ) WITH CHECK ( auth.role() = 'admin' );

Với cách này, admin có quyền cao nhất, trong khi người dùng thường chỉ thao tác trên bản ghi của mình.

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

- Luôn bật RLS cho bảng chứa dữ liệu nhạy cảm. Mặc định, nếu không có policy, mọi truy cập đều bị từ chối. - Test policy kỹ lưỡng. Sử dụng SQL Editor trong Supabase để thử các truy vấn với các role khác nhau. - Sử dụng auth.uid()auth.role() để lấy thông tin người dùng hiện tại. - Kết hợp với Row Level Security và Row Level Security Policies để đảm bảo an toàn tối đa. - Backup policy trước khi thay đổi lớn, vì policy sai có thể khóa toàn bộ dữ liệu.

Kết luận

Row Level Security trong Supabase là công cụ mạnh mẽ giúp bạn bảo vệ dữ liệu ở cấp độ chi tiết nhất. Bằng cách định nghĩa policy rõ ràng, bạn đảm bảo mỗi người dùng chỉ thấy những gì họ được phép, giảm thiểu rủi ro rò rỉ thông tin. Việc kết hợp giữa giao diện trực quan và SQL linh hoạt của Supabase giúp RLS trở nên dễ tiếp cận, ngay cả với những người mới bắt đầu.

Để tìm hiểu sâu hơn, bạn có thể tham khảo tài liệu chính thức của Supabase về Row Level Security và thử nghiệm trên dự án thực tế của mình.

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!