Firebase实时数据库安全规则中可否访问库内数据做token校验
问题解答
完全可以在安全规则中直接读取数据库内存储的token做动态校验,不需要硬编码固定值。
现有规则的逻辑问题
你之前编写的硬编码规则存在逻辑偏差:newData是安全规则的内置变量,指代本次请求待写入当前节点的新数据,你之前的写法本质是校验「本次提交的写入内容里的token字段是否等于硬编码字符串」,根本没有读取数据库中已经存储的动态token值。另外原规则存在多余的尾逗号,属于非法JSON格式,部署时会报解析错误。
读取库内存储数据的规则用法
Firebase实时数据库安全规则提供了两个内置变量用于读取库内已存数据,不需要额外配置即可直接使用:
data:指代当前规则匹配节点的现有存储数据(写入操作执行前的旧数据)root:指代数据库根节点的现有存储数据,跨节点取数时用这个变量即可访问全库任意路径的已存值
动态校验的正确规则实现
你的token存储在/users/$uid/token路径下,要实现写入/users/$uid/files时动态校验请求携带的token和存储值匹配,可以使用如下规则:
{ "rules": { "users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid", "files": { ".write": "newData.hasChild('token') && newData.child('token').val() === root.child('users').child($uid).child('token').val()", ".read": "$uid === auth.uid" } } } } }
规则说明
- 上述规则的校验逻辑为:写入
files节点时,要求待写入数据中必须携带token字段,且该字段值和对应用户UID节点下已存储的token值完全一致,校验通过才允许写入 - 后续周期性更新
/users/$uid/token的值时,不需要修改安全规则,规则会自动读取最新的存储值做校验 - 原规则中
$uid节点的读写权限设置为仅认证用户本人可操作,刚好满足只有用户本人能更新自己节点下token的需求,不会和files节点的写入规则冲突 - 如果你的token实际存储在其他路径,只需要调整
root.child()里的路径层级,指向实际存储位置即可
内容的提问来源于stack exchange,提问作者TommyIsCool
相关产品推荐
相关产品推荐

