mirror of
https://github.com/supabase/supabase.git
synced 2026-10-06 18:05:11 +03:00
I made the crawler renderer resolve legacy JavaScript and Dart reference slugs to their current sections, and updated authored guide and SDK spec links to use them. Exact slugs still win, ambiguous bare slugs still return 404, and `file-buckets-listv2` remains a section slug in canonical links. I kept the www redirect work in a separate draft PR because the apps deploy independently. ## To test - [x] On the Docs preview, request `reference/javascript/order` and `reference/dart/get-user` with a bot user agent. Expect the intended heading and canonical URL. - [x] Request `reference/javascript/file-buckets-listv2` with bot and browser user agents. Expect it to open the list v2 section. - [x] Request `reference/swift/get-user` and the Kotlin reference root with a bot user agent. Expect the intended heading. - [x] Open the Storage quickstart guide and follow its upload reference link. Expect the current JavaScript upload section. ## Linear refs GROWTH-1293 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Reference pages now resolve legacy aliases and ambiguous slugs more accurately, with canonical links that preserve explicit SDK versions. * SDK version paths are recognized only when the full path segment matches the version format, improving reference-page routing. * **Documentation** * Updated API reference links across authentication, storage, security, and SDK guides to point to current pages. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
112 lines
4.3 KiB
Plaintext
112 lines
4.3 KiB
Plaintext
---
|
|
id: 'storage-access-control'
|
|
title: 'Storage Access Control'
|
|
description: 'Learn how to restrict Supabase file uploads.'
|
|
sidebar_label: 'Uploads'
|
|
tocVideo: '4ERX__Y908k'
|
|
---
|
|
|
|
Supabase Storage is designed to work perfectly with Postgres [Row Level Security](/docs/guides/database/postgres/row-level-security) (RLS).
|
|
|
|
You can use RLS to create [Security Access Policies](https://www.postgresql.org/docs/current/sql-createpolicy.html) that are incredibly powerful and flexible, allowing you to restrict access based on your business needs.
|
|
|
|
## Access policies
|
|
|
|
By default Storage does not allow any uploads to buckets without RLS policies. You selectively allow certain operations by creating RLS policies on the `storage.objects` table.
|
|
|
|
You can find the documentation for the storage schema [here](/docs/guides/storage/schema/design) , and to simplify the process of crafting your policies, you can use these [helper functions](/docs/guides/storage/schema/helper-functions) .
|
|
|
|
If you need different `SELECT` policies for different Storage actions, such as listing objects versus reading authenticated objects, use the operation-aware helpers `storage.allow_only_operation()` and `storage.allow_any_operation()` documented in [Storage Helper Functions](/docs/guides/storage/schema/helper-functions).
|
|
|
|
<Admonition type="note">
|
|
|
|
The RLS policies required for different operations are documented [here](/docs/reference/javascript/file-buckets-createbucket)
|
|
|
|
</Admonition>
|
|
|
|
For example, the only RLS policy required for [uploading](/docs/reference/javascript/file-buckets-upload) objects is to grant the `INSERT` permission to the `storage.objects` table.
|
|
|
|
To allow overwriting files using the `upsert` functionality you will need to additionally grant `SELECT` and `UPDATE` permissions.
|
|
|
|
## Policy examples
|
|
|
|
An easy way to get started would be to create RLS policies for `SELECT`, `INSERT`, `UPDATE`, `DELETE` operations and restrict the policies to meet your security requirements. For example, one can start with the following `INSERT` policy:
|
|
|
|
```sql
|
|
create policy "policy_name"
|
|
ON storage.objects
|
|
for insert with check (
|
|
true
|
|
);
|
|
```
|
|
|
|
and modify it to only allow authenticated users to upload assets to a specific bucket by changing it to:
|
|
|
|
```sql
|
|
create policy "policy_name"
|
|
on storage.objects for insert to authenticated with check (
|
|
-- restrict bucket
|
|
bucket_id = 'my_bucket_id'
|
|
);
|
|
```
|
|
|
|
This example demonstrates how you would allow authenticated users to upload files to a folder called `private` inside `my_bucket_id`:
|
|
|
|
```sql
|
|
create policy "Allow authenticated uploads"
|
|
on storage.objects
|
|
for insert
|
|
to authenticated
|
|
with check (
|
|
bucket_id = 'my_bucket_id' and
|
|
(storage.foldername(name))[1] = 'private'
|
|
);
|
|
```
|
|
|
|
This example demonstrates how you would allow authenticated users to upload files to a folder called with their `users.id` inside `my_bucket_id`:
|
|
|
|
```sql
|
|
create policy "Allow authenticated uploads"
|
|
on storage.objects
|
|
for insert
|
|
to authenticated
|
|
with check (
|
|
bucket_id = 'my_bucket_id' and
|
|
(storage.foldername(name))[1] = (select auth.jwt()->>'sub')
|
|
);
|
|
```
|
|
|
|
Allow a user to access a file that was previously uploaded by the same user:
|
|
|
|
```sql
|
|
create policy "Individual user Access"
|
|
on storage.objects for select
|
|
to authenticated
|
|
using ( (select auth.jwt()->>'sub') = owner_id );
|
|
```
|
|
|
|
Allow anyone to access objects in the `avatars` bucket via publishable key. The `allow_any_operation()` filter is critical here as without it users would be able to list the bucket contents.
|
|
|
|
<Admonition type="note">
|
|
|
|
This is not needed for public buckets, as they are already publicly accessible
|
|
|
|
</Admonition>
|
|
|
|
```sql
|
|
create policy "Avatar images are publicly accessible." on storage.objects
|
|
for select using (bucket_id = 'avatars' and storage.allow_any_operation(array['object.get_authenticated_info', 'object.get_authenticated']));
|
|
```
|
|
|
|
---
|
|
|
|
{/* Finish with a video. This also appears in the Sidebar via the "tocVideo" metadata */}
|
|
|
|
<YouTube id="4ERX__Y908k" title="Storage access control policy examples" />
|
|
|
|
## Bypassing access controls
|
|
|
|
If you exclusively use Storage from trusted clients, such as your own servers, and need to bypass the RLS policies, you can use the `service key` in the `Authorization` header. Service keys entirely bypass RLS policies, granting you unrestricted access to all Storage APIs.
|
|
|
|
Remember you should not share the service key publicly.
|