build1 publisherOne report Supabase stops auto-granting anon, authenticated and service_role on new tables in existing projects on October 30, an auditor writing on dev.to reports. Tables created after that need scoped grants in their migrations, since the common GRANT ALL TO public shortcut lets anonymous callers back in.
Reality
- Evidence50
- Adoption
- Insufficient
- Hype gap+10
- Incentives55
- Confidence55
build1 publisherOne report Postgres row-level security on a tenant_id column is the right default for most B2B SaaS apps, a dev.to guide argues, at two statements and a policy per table. Its warning is that a policy can look secure in a migration diff and still let one tenant reach another's data.
Reality
- Evidence55
- Adoption
- Insufficient
- Hype gap+10
- Incentives
- Insufficient
- Confidence50
build1 publisherOne report Postgres blocked a coffee shop's admin top-up at the column GRANT check before RLS ran, and a pg_proc scan found four functions built the same way. The error text does not say which gate refused, so when a correct policy still denies a write, check the grant first.
Reality
- Evidence50
- Adoption
- Insufficient
- Hype gap0
- Incentives
- Insufficient
- Confidence55
build1 publisherOne report PostgreSQL 18.3 handed a serving role with no grant at all on three tenant tables their exact owner and FORCE flags, in a dev.to author's test of three roles. The result gives an RLS setup check a third answer, UNDETERMINED, in cases where it would otherwise return a false nothing to report.
Reality
- Evidence64
- Adoption
- Insufficient
- Hype gap−10
- Incentives25
- Confidence60
build1 publisherOne report Postgres policies do not apply to superusers or table owners, so one Next.js team's isolation pattern turns on which role the app connects as and on a variable set inside each request's transaction.
Reality
- Evidence62
- Adoption15
- Hype gap0
- Incentives20
- Confidence58
build1 publisherOne report A fixture seed that fails under FORCE ROW LEVEL SECURITY has one tempting repair, and after it the write path is guarded only by the read policy, for exactly as long as the statement happens to read a column.
Reality
- Evidence74
- Adoption
- Insufficient
- Hype gap+6
- Incentives24
- Confidence66
build1 publisherOne report A solo-built WhatsApp CRM enforces its tenant boundary with row-level security on 21 tables, and the privilege that actually stopped a production insert sat on a table's auto-increment sequence, granted to one database role and not the other.
Reality
- Evidence45
- Adoption20
- Hype gap−10
- Incentives65
- Confidence50
build1 publisherOne report ENABLE ROW LEVEL SECURITY leaves the table owner exempt, so an app account that owns its tables still reads every tenant. One developer built the same table five ways and found only one of the five sound.
Reality
- Evidence72
- Adoption
- Insufficient
- Hype gap−10
- Incentives22
- Confidence66
build1 publisherOne report The policy checks identity and then a block list, and for a caller with no session the first check goes null while the second inverts to true, so Postgres passes every row. The only way to see it is to run the predicate as anon.
Reality
- Evidence71
- Adoption16
- Hype gap+14
- Incentives29
- Confidence63
build1 publisherOne report A table owner bypasses its own policies with no superuser rights and no BYPASSRLS, and one connection string makes the owner the serving role. Tests seeded with a single tenant never notice.
Reality
- Evidence74
- Adoption
- Insufficient
- Hype gap+14
- Incentives26
- Confidence68