如何配置Supabase仅允许指定域名通过Anon Key访问DataAPI?
配置Supabase仅允许指定域名通过Anon Key访问数据
要实现仅允许www.abc.com通过Anon Key访问数据,需要结合Supabase的来源白名单配置和行级安全(RLS)规则,双重限制才能有效阻止非授权请求。
1. 配置项目允许的来源(CORS限制)
这一步先从请求层面阻止跨域请求,只有指定域名的浏览器请求能通过CORS校验:
- 登录Supabase控制台,进入目标项目
- 导航到Settings > API页面
- 在Allowed Origins列表中,只保留
https://www.abc.com,删除默认的*或其他无关域名(本地开发可临时添加http://localhost:xxxx,上线后移除) - 保存设置,此时非
www.abc.com的浏览器请求会被CORS拦截,但Postman等工具可伪造请求头,因此必须配合RLS规则。
2. 启用行级安全(RLS)并添加来源验证规则
RLS是数据库层面的限制,能确保即使请求绕过CORS,也无法读取数据:
第一步:为目标表启用RLS
对每个需要保护的表执行以下SQL(在Supabase控制台的SQL Editor中运行):
ALTER TABLE your_table_name ENABLE ROW LEVEL SECURITY;
替换your_table_name为实际表名,若有多个表需逐一执行。
第二步:创建验证Referer头的RLS策略
执行以下SQL创建策略,仅允许来自www.abc.com的请求访问数据:
CREATE POLICY "Restrict access to www.abc.com only" ON your_table_name FOR ALL USING ( current_setting('request.headers.referer', true) LIKE 'https://www.abc.com%' );
current_setting('request.headers.referer', true)会获取请求的Referer头LIKE 'https://www.abc.com%'确保请求来源是该域名及其子路径,非匹配请求会被拒绝
3. 存储桶(Storage)的额外配置
若需要限制存储资源的访问,同样要为存储桶添加RLS规则:
CREATE POLICY "Restrict storage access to www.abc.com" ON storage.objects FOR ALL USING ( current_setting('request.headers.referer', true) LIKE 'https://www.abc.com%' );
关键注意事项
- Postman等工具可手动伪造Referer头,但这种场景下攻击者必须知晓目标域名,且无法在浏览器环境中发起非授权请求(浏览器会自动校验Referer的合法性)
- 确保Supabase JS SDK仅在
www.abc.com的前端页面加载,避免Anon Key被泄露到其他环境 - 若需要更严格的验证,可结合JWT自定义声明,但会增加复杂度,当前方案已满足基础的域名限制需求
内容的提问来源于stack exchange,提问作者Ridham Chitre
相关产品推荐
相关产品推荐

