Capgo authorization is RBAC-only.
The old API-key mode system and old org membership rights are removed from the
current schema. Do not add code, RLS policies, tests, or docs that authorize from
API-key read/upload/write/all modes or from org_users rights.
Authorization is based on these tables:
rolespermissionsrole_permissionsrole_bindings
org_users is membership/profile metadata only. It can store the display role
name used by product flows, but it must not grant access. If a user has an
org_users row and no matching role_bindings, authorization must deny.
API keys authorize through role_bindings with principal_type = 'apikey'.
Users authorize through role_bindings with principal_type = 'user'.
Backend code should check explicit permission keys such as:
org.manage_membersorg.manage_settingsapp.readapp.upload_bundleapp.update_settingschannel.promote_bundle
Use the current RBAC helpers:
rbac_check_permission_request(permission_key, org_id, app_id, channel_id)rbac_check_permission(permission_key, org_id, app_id, channel_id)rbac_check_permission_direct(permission_key, user_id, org_id, app_id, channel_id, apikey)
Do not reintroduce helpers that map minimum rights or API-key modes to permissions.
RLS policies must call RBAC permission helpers directly and must stay bounded by the protected row's indexed scope columns.
For tables with an app_id, pass the row's owner_org and app_id into the
RBAC check. For tables without app_id, join through the closest indexed parent
that provides the app or org scope. Do not precompute broad visibility lists by
scanning all apps, versions, channels, or org resources.
Direct client mutation of privilege-bearing tables must be denied unless there is a narrow RBAC policy for the exact action. API-key traffic must never update API-key rows, role bindings, roles, role permissions, org membership metadata, or other privilege state.
The old API-key mode system, minimum-right helper family, org-level RBAC switch, and org membership rights columns are deleted from the current schema and must stay deleted.
The regression tests in supabase/tests/26_test_rls_policies.sql and
tests/security-definer-execute-hardening.test.ts assert the exact final-state
object list.