自定义角色
学习如何在存储架构中使用自定义角色
在本指南中,您将学习如何创建和使用自定义角色来管理 Storage 中对象和存储桶的基于角色的访问控制。同样的方法也适用于 Supabase 的其他服务。
Supabase Storage 使用与其他 Supabase 服务相同的基于角色的访问控制系统,都通过 RLS (行级安全) 实现。
创建自定义角色
让我们创建一个名为 manager
的自定义角色,用于提供对特定存储桶的完全读取权限。如需更高级的设置,请参阅 RBAC 指南。
12345create role 'manager';-- 重要:需要将该角色授予 authenticator 和 anon 角色grant manager to authenticator;grant anon to manager;
创建策略
让我们创建一个策略,为 manager
角色授予对 teams
存储桶中所有对象的完全读取权限。
1234567create policy "管理员可以查看'teams'存储桶中的所有文件"on storage.objectsfor selectto managerusing ( bucket_id = 'teams');
测试策略
要模拟 manager
角色,您需要一个包含 manager
角色的有效 JWT 令牌。您可以使用 Node.js 中的 jsonwebtoken
库快速创建一个。
签署新 JWT 需要您的 JWT_SECRET
。必须安全存储此密钥。切勿在前端代码中暴露它,也不要将其提交到版本控制中。
12345678const 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。
123456789const { 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()