Does the 2026-10-30 auto_expose_new_tables deprecation also revoke default privileges on existing cloud projects? #50308
Replies: 4 comments
|
Two different things are attached to 2026-10-30, and the config comment you quoted is about the one that was cancelled. Separating them answers all three questions.
Q1 — what happens to your project on 2026-10-30The rollout changes the default-privilege layer so new objects in This was asked directly in the announcement thread and confirmed by Supabase:
The mechanism is why: So if least privilege on the existing tables is the goal, October 30 will not do it for you — that needs explicit Q2 — revoking it yourselfSplit by owning role, which decides both permission and support:
Nothing the platform manages depends on the Q3 — what to followDiscussion #45329 is the announcement and carries the three dates; the thread itself has become the de-facto migration note, including @steve-chavez's confirmation above. Security Advisor flags affected tables, and Data API settings in the dashboard lists what is currently exposed. Why local and production disagreeWorth naming, since it is the measurement that prompted the question: your fresh local stack isn't drifting from your migrations — it is already sitting in the post-October state. The Go shell's if utils.Config.Api.AutoExposeNewTables != nil && *utils.Config.Api.AutoExposeNewTables {
return nil
}
// ...otherwise run RevokeDefaultDataApiPrivilegesSqlwhile the current config schema documents unset as auto-expose, matching cloud. With the flag unset you can land on either behaviour depending on which shell bootstraps the stack, which is what #6337 was fixing. Stop relying on the implicit default and pin it. Given you want least privilege anyway, the version that survives October unchanged is: [api]
auto_expose_new_tables = false(the local equivalent of the cloud toggle, added in CLI v2.102.0), plus explicit |
|
A related footgun to the one-way deprecation: because old projects keep the auto_expose default while the new default flips for fresh projects, any client built against the OLD default silently re-exposes new tables on every schema change unless it explicitly opts in to the new behavior at connection time. The migration-safe move is to make exposure explicit in your client/DDL tooling now, rather than relying on whichever default was active when the project was created - that way the flip on 2026-10-30 won't change what an old project actually exposes. |
|
The conclusion is right, but the mechanism in the first half is not, and the difference matters for anyone planning around 2026-10-30. There is no client-side opt-in here. It is also not "on every schema change". Default privileges attach to objects as they are created. A migration that alters an existing table grants nothing new; a migration that creates a table gets whatever default ACL is in force for the creating role at that moment. Where this lands for the original question, and it is the part worth keeping: since the grants are materialised into each object's own ACL when it is created, nothing retroactive happens on 2026-10-30, and @steve-chavez confirmed that existing tables on existing projects keep their grants and will not be silently revoked. What changes is the default that new objects inherit after that date. So the advice to make exposure explicit is sound — but the reason is not that a client might re-expose something. It is that relying on any implicit default leaves the surface defined by when the project happened to be created. Explicit |
|
) |
Uh oh!
There was an error while loading. Please reload this page.
Context
Our production project (created a while back) has default ACL rules on the
publicschemathat auto-expose new objects to the Data API roles. Running:
on production returns two rules on
public, owned bypostgresandsupabase_admin, bothgranting
arwdDxtmtoanon,authenticatedandservice_rolefor relations.The practical effect, measured today: all 24 tables in
publicreturntrueforhas_table_privilege('anon', oid, 'SELECT'). A fresh local stack built from the exact samemigrations returns
falsefor all 24 — no default ACL rules onpublicthere.To be clear about what we already have in place: RLS is enabled AND forced on all 24 tables
in production, so this is not a "you forgot to enable RLS" situation. What we are looking at
is the privilege layer underneath it, and the fact that it differs between an old cloud
project and a fresh environment built from identical migrations.
The CLI config documents the deprecation like this:
Questions
On 2026-10-30, does Supabase remove or revoke these
pg_default_aclrows on existingcloud projects, or does that date only remove the
auto_expose_new_tablesfield from theCLI config, leaving already-created databases with their current default privileges
unchanged?
If existing projects are not touched, is it safe and supported for us to run
ALTER DEFAULT PRIVILEGES IN SCHEMA public ... REVOKE ...ourselves against the twoowning roles? Specifically, would revoking the
supabase_adminrule interfere withanything the platform manages on our behalf?
Is there any announcement or migration note for existing projects that we should be
following?
Thanks — happy to provide anything else that helps.
All reactions