如何限制Firebase实时数据库仅支持特定域名参数的查询访问?
如何限制Firebase实时数据库仅支持特定域名参数的查询访问?
我来帮你搞定这个权限控制的问题!首先你得注意,当前的Firebase规则完全开放(.read和.write都设为true),这才导致任何人都能直接看到所有白名单域名。要实现你要的效果,我们需要调整数据结构+修改规则,具体步骤如下:
第一步:调整数据库的数据结构
你现在用的是数组存储域名,这种结构在Firebase里很难做精准的访问权限控制——因为数组的索引是数字,没法通过请求的域名参数直接定位到对应的元素。建议改成对象结构,把每个域名作为键,值可以设为true(或者其他标记值),示例如下:
{ "www.eatingfact-tenolent.blogspot.com": true, "www.prothomalo-tenolent.blogspot.com": true }
这种结构不仅能让Firebase规则精准匹配单个域名,还能提升查询效率。
第二步:修改Firebase实时数据库规则
接下来我们要写规则,实现两个核心要求:
- 直接访问
domains.json(也就是根路径/domains)时,禁止读取任何内容 - 只有访问
domains.json/[具体域名]时,才返回该域名的存在状态(存在则返回值,不存在则拒绝访问)
替换你的规则为以下内容:
{ "rules": { "domains": { // 禁止直接读取整个白名单列表 ".read": false, // 允许读取单个域名节点,仅当该域名在白名单中存在时 "$domain": { ".read": "data.exists()" } }, // 严格锁死写权限,这里建议用Firebase Auth限制仅管理员能写,示例中先设为false防止恶意修改 ".write": false } }
规则解释:
- 当有人直接访问
https://sitelicenses-default-rtdb.firebaseio.com/domains.json时,因为/domains节点的.read设为false,会返回权限拒绝,看不到任何内容。 - 当请求带域名参数,比如
https://sitelicenses-default-rtdb.firebaseio.com/domains.json/www.prothomalo-tenolent.blogspot.com,规则会检查$domain对应的节点是否存在:- 如果域名在白名单里,
data.exists()为true,允许读取,返回true(你设置的对应值)。 - 如果域名不在白名单里,
data.exists()为false,返回权限拒绝,间接说明域名未被授权。
- 如果域名在白名单里,
额外的安全建议
- 锁死写权限:千万不要像原来那样开放
.write为true,不然任何人都能修改你的白名单。建议通过Firebase Auth限制仅你的管理员账号能写,比如:".write": "auth != null && auth.uid === '你的管理员账号UID'" - 测试规则:用Firebase控制台的「规则模拟器」测试不同请求场景,比如直接访问根路径、访问存在的域名、访问不存在的域名,确保符合预期。
关于原数组结构的说明
如果你实在不想修改数组结构,很遗憾——Firebase规则几乎没法实现你的需求,因为数组的索引是数字,无法通过请求的域名参数关联到数组中的某个元素,所以强烈建议改成对象结构。
备注:内容来源于stack exchange,提问作者Hasnain Mahmud Hira
相关产品推荐
相关产品推荐

