- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下子集合结构:
/projects/{projectId}/documents/{documentId}
其中每个文档都有一个用于检查每个文档的安全规则的访问
映射:
{
title: "A Great Story",
content: "Once upon a time ...",
access: {
alice: true,
bob: false,
david: true,
jane: false
// ...
}
}
如何设置安全规则:
match /{path=**}/documents/{documentId} {
allow list, get: if resource.data.access[request.auth.uid] == true;
}
当我想查询 alice 可以跨所有项目访问的所有文档时:
db.collectionGroup("documents").where(`access.${uid}`, "==", true);
我收到一条错误消息,告诉我需要为 access.alice
、access.david
等创建集合组索引。
如何通过集合组查询克服此索引问题?
最佳答案
作为索引的快速概述,有两种类型 - 复合索引(用于将多个字段连接在一起)或单字段索引。默认情况下,对于普通集合查询,会自动为文档的每个字段创建单字段索引;对于集合组查询,则会禁用单字段索引。如果字段的值是数组,则该数组的值将添加到Array Contains索引中。如果字段的值是原始值(字符串、数字、时间戳等),则文档将添加到该字段的升序和降序索引中。
启用 access
的查询对于集合组查询的字段,必须创建索引。虽然您可以单击进行查询时收到的错误消息中的链接,但这只会为您正在查询的用户添加索引(例如 access.alice
、 access.bob
等)。相反,您应该使用 Firebase Console告诉 Cloud Firestore 为 access
创建索引(这将为每个子级创建索引)。打开控制台后,使用“添加豁免”按钮(考虑使用“豁免”来表示“覆盖默认设置”)来定义新的索引规则:
在第一个对话框中,使用以下设置:
Collection ID: "documents"
Field Path: "access"
Collection: Checked ✔
Collection group: Checked ✔
在第二个对话框中,使用以下设置:
在您的安全规则中,您还应该检查目标用户是否在 access
中在做平等之前先映射。访问丢失的属性时会抛出“对象上的属性未定义”。拒绝访问的错误,如果您稍后将语句与 ||
组合在一起,这将成为一个问题.
要解决此问题,您可以使用:
match /{path=**}/documents/{documentId} {
allow list, get: if request.auth.uid in resource.data.access
&& resource.data.access[request.auth.uid] == true;
}
或者在找不到所需的键时提供后备值:
match /{path=**}/documents/{documentId} {
allow list, get: if resource.data.access.get(request.auth.uid, false) == true;
}
作为违反规则的示例,假设您希望“员工”用户能够阅读文档,即使他们不在该文档的 access
中 map 。
这些规则总是会出错并失败(如果工作人员的用户 ID 不在 access
map 中):
match /{path=**}/documents/{documentId} {
allow list, get: if resource.data.access[request.auth.uid] == true
|| get(/databases/$(database)/documents/users/$(request.auth.uid)).data.get("staff", false) == true;
}
然而,这些规则会起作用:
match /{path=**}/documents/{documentId} {
allow list, get: if resource.data.access.get(request.auth.uid, false) == true
|| get(/databases/$(database)/documents/users/$(request.auth.uid)).data.get("staff", false) == true;
}
顺便说一句,除非您需要查询用户无权访问的文档,否则从访问映射中忽略该用户会更简单。
{
title: "A Great Story",
content: "Once upon a time ...",
access: {
alice: true,
david: true,
// ...
}
}
关于firebase - 火存储 : How to query a map of roles inside a subcollection of documents?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68060480/
我正在评估在 Azure 中部署 Web 服务的各种选项。目前,Web 服务将仅由前端 UI 使用,该前端 UI 将作为单独的 Web 角色部署在托管 Web 服务的同一云服务中。然而,Web 服务将
我正在尝试在 Azure 中创建一个自定义角色,允许订阅“所有者”执行几乎所有操作,但取消/重命名自己的订阅或移至另一个管理组。 我还希望他们能够向他们想要的人授予正确的访问权限(特别是内置的“贡献者
我是 Ansible 的新手,我已经创建了我的第一个 Ansible 角色剧本,当我尝试运行它时,它抛出了下面的错误,而角色之外的其他模块(如处理程序、模板)工作正常。我仅通过剧本中的角色观察到这个问
我正在使用 Selenium 进行自动化测试。有什么区别 java -jar selenium-server-standalone-2.24.1.jar -role hub 和 java -jar s
根据WAI-ARIA specification两个角色都应该有: 关注第一个可聚焦元素 用户不能离开对话框 应该设置适当的 aria-label 应该用来中断流程,并且应该要求采取一些行动,例如单击
我想设计一个具有以下要求的数据库,但我遇到了问题。 我有 3 种类型的用户:医生、注册用户和管理员。将来我可能会添加其他类型的用户。这些用户类型中的每一种都有不同的配置文件字段。例如,注册用户应该有
我是 jQuery 和网页设计的新手,请原谅我问这个幼稚的问题。 关于latest jQuery mobile website ,他们的例子是: Page content goes here
我正在查看文档: http://pyqt.sourceforge.net/Docs/PyQt4/qtablewidgetitem.html#data 我可以将行 IDList.append(item.
我看到角色出现一些奇怪的异常,我不知道如何解释。角色名RD........ under ,我能期望它是什么?它是我在该特定服务组中的所有服务都在其上运行的底层机器吗? 最佳答案 Application
我正在尝试使用我的 GitHub 设置 CodeDeploy,但发现了一些问题。 我已使用 AWSCodeDeployRole 策略创建了服务角色,如文档中所述。 在我的 Code Deploy 应用
我正在尝试创建一个 Web 服务并将其部署到 Azure 云服务 场景非常简单:通过 http 或 https 向服务发送请求并接收一些数据。 我无法从文档中判断这是否应该在 WebRole 或 Wo
我从 ASP.NET Identity 的声明授权开始,如果我的应用程序中需要“角色”概念,我想阐明处理它们的方式。 注意:我对这个真的很陌生,所以所有的概念都在我脑海中飞舞,请多多关照,对于任何概念
我知道这个问题与一些类似,但我的设置与那些不同。 EF 中具有以下类的正确配置是什么? 这里的问题是 Team有一个可选的 DivisionParticipant ,但是 DivisionPartic
我无法运行 Windows Azure Hello World 示例。它给了我以下错误: “一个或多个角色启动角色失败”。 我将项目放在 D 驱动器的根目录中,以确保路径长度不是问题。我还清除了 Az
我正在尝试向我的 Xcode 添加一个帐户,但我一直收到此错误。另一个 Xcode 上的相同帐户可以完美运行。我有其他帐户运行良好。 错误是(如标题所述) The role information i
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
在 Bash 脚本中,我想删除 Postgres 用户角色。但是 Postgres 不允许我这样做,我得到了 Cannot drop table X because other objects dep
我目前正在设置一个新项目并创建我的登录系统。由于某种原因,它似乎正在搜索角色表?到目前为止,这是我的结构: Controller public function action_index() {
我有三个模型,一个用户,一个个人资料和一个角色,我试图通过个人资料角色附加到用户强>. # user.rb class User :profiles has_many :users end 我正
我想使用 Spring Security JSP 标签库根据角色有条件地显示一些内容。但是在 Spring Security 3.1.x 中只检查一个角色。 我可以使用,但 ifAllGranted
我是一名优秀的程序员,十分优秀!