Bỏ qua để đến nội dung
Knowledge Hub

Tình huống: khách thấy hoá đơn của công ty khác Nâng cao

Thời gian đọc ước tính: 1 phút

Hai trăm công ty dùng chung một schema PostgreSQL, chỉ tách nhau bằng cột tenant_id. Một công ty thấy hoá đơn của công ty khác trong file export, nhưng không phải lần nào cũng thấy.

Bạn có năm quyết định: khoanh vùng, đọc code, tìm vì sao RLS không có tác dụng, lần ra lỗi lộ lúc có lúc không, và giữ cho lỗi không quay lại.

  • Câu hỏi ở mỗi bước: role nào chạy query này, và connection đang nghĩ mình phục vụ tenant nào?
  • Điểm chỉ tính lựa chọn đầu tiên ở mỗi bước. Số liệu tái hiện lấy từ script trong examples/src/row-level-security/ chạy trên PostgreSQL 17.
Tình huống

Khách thấy hoá đơn của công ty khác, lúc có lúc không

Bạn là backend lead của một SaaS hoá đơn B2B: 200 công ty trong một schema PostgreSQL 17, mọi bảng có tenant_id. API viết bằng Node.js, dùng pg.Pool sau PgBouncer ở transaction mode. Số liệu trong tình huống là minh hoạ.

Đường lộ dữ liệu đã biết còn mở1
Response lộ chéo tenant / ngày (ước tính)40
Export hoá đơn hoạt động100 %
Bảng tenant chưa có RLS + FORCE38

Bước 1/5 · Ticket từ Globex

9:40, trưởng phòng tài chính của Globex (tenant 2) viết: "File CSV export hoá đơn của chúng tôi có hoá đơn của Acme. Tuần này bị hai lần, không phải lần nào cũng bị." Kèm theo file có số hoá đơn của Acme. Tính năng export ra mắt 9 ngày trước.

bề mặt bị ảnh hưởng
GET /api/invoices/export.csv
dữ liệu
số hoá đơn, số tiền, tên khách hàng
tái hiện theo ý muốn
chưa được

Bạn làm gì?

Chơi xong, đọc Row-level security cho multi-tenancy để xem policy, các role bỏ qua policy và helper SET LOCAL.