【问题标题】:Get role in every rule Firebase security在每条 Firebase 安全规则中扮演角色
【发布时间】:2021-10-11 11:37:14
【问题描述】:

你好,我在我的用户集合中有一个角色,我想根据角色编写规则,所以如果角色是老师,你可以访问比父角色更多的东西。现在我的问题是我有可能访问该角色并将其用于每个集合,而不仅仅是用户集合。就像每次只检查你的角色是什么的功能? 我是第一次这样做,到目前为止,我不太确定我是否理解所有内容。

这是我目前的规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
  
  function isSignedIn() {
      return request.auth != null;
    }

   function isOneOfRoles(rsc, array) {
      return isSignedIn() && ((getRole() in array) || rsc.data.openWorld == true);
}
    function getRole() {
    return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 'pädagoge';
}
   
      
    match /posts/{userPosts} {
      allow read: if isSignedIn();
      allow create: if isOneOfRoles(resource, ['pädagoge']);
    }
     match /messages/{messages} {
      allow read, write: if isSignedIn();
      
    }
  }
}

更新

【问题讨论】:

  • "是否有可能我可以访问该角色并将其用于每个集合" => 是的,它是像你一样定义函数或像explained in the doc。我没有检查您的规则,但是您目前在使用这些规则时遇到了什么问题?
  • 更彻底地查看您的规则,您似乎应该在if isOneOfRoles(resource, ['pädagoge']); 中使用request.resource 而不是resource,但这取决于您的确切查询。 (文档摘录:“写入数据时,您可能希望将传入数据与现有数据进行比较。在这种情况下,如果您的规则集允许挂起写入,则request.resource 变量包含文档的未来状态。”)
  • 我试图测试在 userPost 中创建我收到此错误: Function [get] called with wrong path: /databases/(default)/documents/users/
  • 你如何测试?通过控制台中的模拟器或通过您部署的应用程序?
  • 通过模拟器。

标签: google-cloud-firestore firebase-security


【解决方案1】:

我已在 Firestore“规则游乐场”中尝试过您的安全规则。您可以在下面看到您需要做isOneOfRoles(request.resource, ['pädagoge']);:只有resource,规则引擎无法检查字段openWorld的值,因为文档的未来状态包含在request.resource 变量,不在resource 之一。有关详细信息,请参阅doc

您还需要在 users 集合中有一个对应的用户,该用户的 role 字段的值为 pädagoge:在我的示例中,用户的 UID 是 A1(即 Firestore 文档在users 收藏)。请参阅下面的第二个和第三个屏幕截图,我们如何在“规则游乐场”模拟器的 Firebase UID 字段中使用此值。

(与上面相同的屏幕截图,只有左窗格向下滚动以显示Firebase UID 字段)


【讨论】:

  • 我不明白我按照你的解释做了,这次我仍然遇到错误:错误:simulator.rules 行 [19],列 [37]。对象上的属性资源未定义。
  • 你能补充一下你的问题吗:1/模拟器的截图就像我在anwser中所做的那样。不要忘记您需要在新文档中将openWorld 字段设置为true => 查看我的第一个屏幕截图:在“构建文档”按钮下,您可以看到openWorld 字段。 2/ 用户收藏的截图。
  • 我更新了帖子,并将字段设置为 true
  • 能否也显示模拟器左窗格的顶部,请
  • 天哪,谢谢!!!它有效:)
猜你喜欢
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2020-12-24
  • 1970-01-01
相关资源
最近更新 更多