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.
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ạ.
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.