Row Level Security (RLS) trong PostgreSQL
RLS, hay Row-Level Security (bảo mật cấp độ hàng), là một tính năng bảo mật mạnh mẽ trong PostgreSQL cho phép bạn kiểm soát quyền truy cập dữ liệu ở cấp độ hàng riêng lẻ. Nói cách khác, bạn có thể xác định chính sách để hạn chế người dùng xem hoặc sửa đổi các hàng cụ thể trong bảng dựa trên danh tính của họ hoặc các tiêu chí khác.
Cách RLS hoạt động:
Enable RLS: Theo mặc định, RLS bị disabled. Bạn cần bật nó rõ ràng cho mỗi bảng bằng câu lệnh
ALTER TABLE ... ENABLE ROW LEVEL SECURITY
.Chính sách bảo mật: Sau khi bật RLS, bạn cần xác định các chính sách bảo mật để kiểm soát quyền truy cập.
Xác định chính sách (
CREATE POLICY
): Chính sách được tạo bằng lệnhCREATE POLICY
và bao gồm:Tên chính sách: Mỗi chính sách cần có một tên duy nhất cho mỗi bảng.
Vai trò áp dụng: Chính sách có thể được chỉ định cho các vai trò cụ thể hoặc cho tất cả người dùng (
PUBLIC
).Loại lệnh: Chính sách có thể áp dụng cho tất cả các lệnh (
ALL
) hoặc cho các lệnh cụ thể nhưSELECT
,INSERT
,UPDATE
,DELETE
.Điều kiện truy cập (
USING
): Đây là một biểu thức Boolean xác định các hàng mà chính sách cho phép truy cập. Biểu thức này được đánh giá cho mỗi hàng dựa trên quyền của người dùng đang chạy truy vấn.Điều kiện kiểm tra (
WITH CHECK
): Tương tự nhưUSING
, nhưng được sử dụng để kiểm tra các hàng bị sửa đổi bởi các lệnh nhưINSERT
hoặcUPDATE
.
Kết hợp nhiều chính sách: Khi nhiều chính sách được áp dụng cho một truy vấn:
Chính sách cho phép (
OR
): Theo mặc định, các chính sách được kết hợp bằng toán tửOR
, nghĩa là người dùng có quyền truy cập nếu thỏa mãn ít nhất một chính sách.Chính sách hạn chế (
AND
): Bạn có thể chỉ định chính sách là hạn chế (AS RESTRICTIVE
) để yêu cầu người dùng phải thỏa mãn tất cả các chính sách được áp dụng.
Ví dụ:
Giả sử bạn có một bảng accounts
và muốn chỉ cho phép người dùng thuộc vai trò managers
truy cập vào các tài khoản mà họ quản lý. Bạn có thể tạo một chính sách RLS như sau:
CREATE TABLE accounts (manager text, company text, contact_email text);
ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;
CREATE POLICY account_managers ON accounts TO managers USING (manager = current_user);
Trong ví dụ này:
account_managers
là tên chính sách.managers
là vai trò được áp dụng chính sách.USING (manager = current_user)
là điều kiện truy cập, chỉ cho phép truy cập vào các hàng có cộtmanager
trùng với tên người dùng hiện tại (current_user
).
Lưu ý quan trọng:
Chủ sở hữu bảng: Chủ sở hữu bảng thường không bị ràng buộc bởi chính sách RLS, nhưng có thể chọn áp dụng chính sách cho chính họ bằng tùy chọn
FORCE ROW LEVEL SECURITY
.Người dùng đặc biệt: Người dùng siêu cấp (superuser) và vai trò có thuộc tính
BYPASSRLS
luôn bỏ qua RLS.Kiểm tra toàn vẹn tham chiếu: Các ràng buộc như khóa chính, khóa ngoại luôn bỏ qua RLS để đảm bảo tính toàn vẹn dữ liệu.
Vấn đề race condition: Khi sử dụng truy vấn con (
sub-SELECT
) trong biểu thức chính sách, cần cẩn thận với các vấn đề race condition, đặc biệt là trong môi trường đồng thời cao.
RLS cung cấp khả năng kiểm soát truy cập dữ liệu linh hoạt và chi tiết. Bằng cách xác định chính sách phù hợp, bạn có thể tăng cường đáng kể tính bảo mật cho cơ sở dữ liệu PostgreSQL của mình.