使用 firebase 的嵌套子文档的安全规则
Security rules for nested subdocuments with firebase
我正在尝试使用 firebase 创建一个允许用户创建文档的文本编辑器应用程序,但他们也可以在现有文档中嵌套一个新文档(编辑文档时,他们可以点击一个按钮这将在数据库中添加一个新文档并在重定向到此页面的编辑器中插入一个 link:
用户可以与其他用户共享文档,但他们也应该可以访问所有嵌套的文档。所以现在我想知道如何编写安全规则来做到这一点。
我认为构造 实时数据库 的最佳方法是将所有文档存储在根目录下,然后添加 parentDocument
或 path
属性 到每个文档:
{
"documents": {
"doc-1": {
"title":"Lorem ipsum",
"content": "...",
"path":"/",
"owner":"user-1",
"canAccess":{
"user-3":true
}
},
"doc-2": {
"title":"Dolor sit",
"content": "...",
"path":"/doc-1/",
"owner": "user-1"
"canAccess": {
"user-2":true
}
}
},
"users": {
"user-1": { ... },
"user-2": { ... },
"user-3": { ... }
}
}
↑ 在下面的例子中,
- doc-2 嵌套在 doc-1 中
- user-1 可以访问 doc-1 和 doc-2
- user-2 只能访问 doc-2
- user-3 可以访问 doc-1 和 doc-2
但现在我不知道如何管理安全规则,因为要检查用户是否有权访问特定文档,我想它需要通过其每个父项(使用其 path
或 parentDocument
道具)。也许我也可以在 each 文档上指定 canAccess
属性,但是每当父级的 canAccess
属性更新时,我就必须更新每个嵌套文档......
如有任何帮助,我们将不胜感激
在 Firebase 实时数据库模型中 permission automatically cascades 向下。这意味着一旦您授予用户(读或写)特定路径的权限,他们也可以访问该路径下的所有数据。您再也无法撤销较低级别的权限。
所以您的要求实际上与此模型非常匹配,我建议您尝试实施它并在您 运行 遇到问题时报告。
我正在尝试使用 firebase 创建一个允许用户创建文档的文本编辑器应用程序,但他们也可以在现有文档中嵌套一个新文档(编辑文档时,他们可以点击一个按钮这将在数据库中添加一个新文档并在重定向到此页面的编辑器中插入一个 link:
用户可以与其他用户共享文档,但他们也应该可以访问所有嵌套的文档。所以现在我想知道如何编写安全规则来做到这一点。
我认为构造 实时数据库 的最佳方法是将所有文档存储在根目录下,然后添加 parentDocument
或 path
属性 到每个文档:
{
"documents": {
"doc-1": {
"title":"Lorem ipsum",
"content": "...",
"path":"/",
"owner":"user-1",
"canAccess":{
"user-3":true
}
},
"doc-2": {
"title":"Dolor sit",
"content": "...",
"path":"/doc-1/",
"owner": "user-1"
"canAccess": {
"user-2":true
}
}
},
"users": {
"user-1": { ... },
"user-2": { ... },
"user-3": { ... }
}
}
↑ 在下面的例子中,
- doc-2 嵌套在 doc-1 中
- user-1 可以访问 doc-1 和 doc-2
- user-2 只能访问 doc-2
- user-3 可以访问 doc-1 和 doc-2
但现在我不知道如何管理安全规则,因为要检查用户是否有权访问特定文档,我想它需要通过其每个父项(使用其 path
或 parentDocument
道具)。也许我也可以在 each 文档上指定 canAccess
属性,但是每当父级的 canAccess
属性更新时,我就必须更新每个嵌套文档......
如有任何帮助,我们将不胜感激
在 Firebase 实时数据库模型中 permission automatically cascades 向下。这意味着一旦您授予用户(读或写)特定路径的权限,他们也可以访问该路径下的所有数据。您再也无法撤销较低级别的权限。
所以您的要求实际上与此模型非常匹配,我建议您尝试实施它并在您 运行 遇到问题时报告。