firebase-realtime-database - 如何将 Firebase 实时数据库项目限制为对象中存在的“用户”
问题描述
我有一个实时数据库,所有设置和工作。数据结构非常简单:
项目一些:信息一些:其他信息
第 2 项一些:信息一些:其他信息
我的规则也超级简单:
{
"rules": {
".read":"auth.uid != null",
".write":"auth.uid != null"
}
}
问题(显然)是,当我强制用户进行身份验证时,这就是我所需要的,任何用户都可以访问数据库中的所有项目。
我想要的是一种将用户限制在某个项目上的方法。
就像是:
项目1
- 一些:信息
- 一些:其他信息
- user_1:auth.uid
- user_2:auth.uid2
项目2
- 一些:信息
- 一些:其他信息
- 用户 1:auth.uid3
- user_2:auth.uid4
我可以存储这些数据,但我不确定如何构建我的规则来限制它。
我的实际 json 看起来像:
{
"annotations": {
"8df0309f-dc62-821e-dd65-f0ad46396937": {
"author": "1OXVKN3Y5Z-11",
"xfdf": "LONG STRING"
}
},
"complete": false,
"created_at": "2020-09-01T17:52:25.653Z",
"field_values": {
"field_name": {
"name": "copy",
"value": "TEsting",
"widgetID": "e61e3abf-7cdd-7d07-daec-6c3d3a55d667"
}
},
"stamp_count": 0
}
我计划实施的是:
{
"annotations": {
"8df0309f-dc62-821e-dd65-f0ad46396937": {
"author": "1OXVKN3Y5Z-11",
"xfdf": "LONG STRING"
}
},
"complete": false,
"created_at": "2020-09-01T17:52:25.653Z",
"field_values": {
"field_name": {
"name": "copy",
"value": "TEsting",
"widgetID": "e61e3abf-7cdd-7d07-daec-6c3d3a55d667"
}
},
"stamp_count": 0,
"users": [ "CFX4I0PTM9-11", "CFX4I0PTM9-7"]
}
我实现了那个 json 结构,我该如何设置规则来支持?
解决方案
通过阅读您的问题和评论线程,我认为您的要求是:
如果用户的 UID 与该项目相关联,则允许用户访问该项目。
在这种情况下,您首先需要确保 UID 位于键中,因为您无法像建议的users
数组所要求的那样跨多个值进行搜索。所以你最终会得到:
"items": {
"item1": {
...
"users": {
"CFX4I0PTM9-11": true,
"CFX4I0PTM9-7": true
}
}
}
现在使用这种结构,您可以确保用户只能使用以下users
规则更新其 UID 在地图中的项目:
{
"rules": {
"items": {
"$itemid": {
".write": "data.child('users').child(auth.uid).exists()"
}
}
}
}
要阅读特定项目,您可以使用类似的规则。这将允许用户在知道项目的完整路径以及他们的 UID 在users
地图中时读取项目。
但是您将无法查询此结构,因为您只能对命名属性进行索引。有关这方面的更多信息,以及仍然实现您的用例的替代数据结构,请参阅 Firebase 查询,如果子项的子项包含值
推荐阅读
- javascript - React:如何从另一个组件调用它自己的渲染组件函数?
- unity3d - 如何在 Unity 中为碰撞添加反作用力?
- angular - 来自 json 数据的未定义响应
- javascript - Firebase 函数日志为空
- java - 如果未正确完成,RestEasyClient JAX RS 可能的资源泄漏
- ruby-on-rails - Rails:表单助手未正确保存参数
- javascript - 使用 GraphQL 在单个字段上设置解析器
- angular - 基于角色的Angular 4路由默认页面
- reactjs - 如何在测试中获取反应应用状态 ['Key'] 的值?
- ruby-on-rails - 如何在 Rails 4 中设置嵌套资源控制器?