存储

自定义角色

学习如何在存储架构中使用自定义角色


在本指南中,您将学习如何创建和使用自定义角色来管理 Storage 中对象和存储桶的基于角色的访问控制。同样的方法也适用于 Supabase 的其他服务。

Supabase Storage 使用与其他 Supabase 服务相同的基于角色的访问控制系统,都通过 RLS (行级安全) 实现。

创建自定义角色

让我们创建一个名为 manager 的自定义角色,用于提供对特定存储桶的完全读取权限。如需更高级的设置,请参阅 RBAC 指南

1
2
3
4
5
create role 'manager';-- 重要:需要将该角色授予 authenticator 和 anon 角色grant manager to authenticator;grant anon to manager;

创建策略

让我们创建一个策略,为 manager 角色授予对 teams 存储桶中所有对象的完全读取权限。

1
2
3
4
5
6
7
create policy "管理员可以查看'teams'存储桶中的所有文件"on storage.objectsfor selectto managerusing ( bucket_id = 'teams');

测试策略

要模拟 manager 角色,您需要一个包含 manager 角色的有效 JWT 令牌。您可以使用 Node.js 中的 jsonwebtoken 库快速创建一个。

1
2
3
4
5
6
7
8
const jwt = require('jsonwebtoken')const JWT_SECRET = 'your-jwt-secret' // 您可以在 Supabase 项目设置的 API 部分找到此密钥。请安全存储。const USER_ID = '' // 要赋予 manager 角色的用户 IDconst token = jwt.sign({ role: 'manager', sub: USER_ID }, JWT_SECRET, { expiresIn: '1h',})

现在您可以使用此令牌访问 Storage API。

1
2
3
4
5
6
7
8
9
const { StorageClient } = require('@supabase/storage-js')const PROJECT_URL = 'https://your-project-id.supabase.co/storage/v1'const storage = new StorageClient(PROJECT_URL, { authorization: `Bearer ${token}`,})await storage.from('teams').list()