⚡
SponsorBlock: Đã tự động bỏ qua phân đoạn tài trợ / quảng cáo!
Quên một dòng WHERE tenant_id là đủ để khách A xem được đơn hàng của khách B. Row Level Security trong PostgreSQL cho database tự chặn chuyện này, kể cả khi code quên filter.
Trong 90 giây, video đi qua:
✅ Bật RLS và viết policy lọc theo tenant bằng current_setting
✅ Cách Supabase dùng đúng cơ chế này với JWT claims
✅ Bẫy 1: table owner mặc định bỏ qua RLS, phải dùng FORCE ROW LEVEL SECURITY
✅ Superuser bỏ qua RLS kể cả khi đã FORCE, nên app phải dùng role riêng
✅ Bẫy 2: chạy PgBouncer ở transaction mode thì dùng SET LOCAL thay cho SET
Phù hợp cho: lập trình viên đang xây SaaS multi-tenant trên PostgreSQL, hoặc đang dùng Supabase mà chưa hiểu bên dưới nó chặn dữ liệu thế nào.
Mẹo khi đưa vào code: dùng set_config(‘app.tenant_id’, @tenantId, true) để vừa truyền được tham số, vừa có hiệu lực giống SET LOCAL.
RLS không thay cho code cẩn thận. Nó là lưới an toàn cuối cùng. Tập sau: vì sao PostgreSQL gần như bắt buộc phải có connection pooler. Đăng ký kênh để không bỏ lỡ ????
Trong 90 giây, video đi qua:
✅ Bật RLS và viết policy lọc theo tenant bằng current_setting
✅ Cách Supabase dùng đúng cơ chế này với JWT claims
✅ Bẫy 1: table owner mặc định bỏ qua RLS, phải dùng FORCE ROW LEVEL SECURITY
✅ Superuser bỏ qua RLS kể cả khi đã FORCE, nên app phải dùng role riêng
✅ Bẫy 2: chạy PgBouncer ở transaction mode thì dùng SET LOCAL thay cho SET
Phù hợp cho: lập trình viên đang xây SaaS multi-tenant trên PostgreSQL, hoặc đang dùng Supabase mà chưa hiểu bên dưới nó chặn dữ liệu thế nào.
Mẹo khi đưa vào code: dùng set_config(‘app.tenant_id’, @tenantId, true) để vừa truyền được tham số, vừa có hiệu lực giống SET LOCAL.
RLS không thay cho code cẩn thận. Nó là lưới an toàn cuối cùng. Tập sau: vì sao PostgreSQL gần như bắt buộc phải có connection pooler. Đăng ký kênh để không bỏ lỡ ????
- Category
- Học Lập Trình Trực Tuyến
- Tags
- teduco











