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