相关疑难解决方法(0)

Firestore安全规则使用对另一个文档的引用

我试图将安全规则建立在对另一个对象的引用上.

我有一组用户和角色集合.用户对象具有名为"role"的字段,该字段是对roles集合中特定文档的引用.

users
  id
  name
  role <-- reference to particular role

roles
  id
  name
  isSuperUser
Run Code Online (Sandbox Code Playgroud)

这里的目标是允许具有特定角色的用户(isSuperUser == true的角色)编辑任何其他角色或其子集合;

以下是我原本认为可行的规则:

service cloud.firestore {
   match /databases/{database}/documents {
    match /users/{userId=**} {
     allow read, write: if request.auth.uid == userId;
   }
   match /roles/{roleId=**} {
      function isSuperUser() {
       return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role.isSuperuser == true;
      }
      allow read: if request.auth.uid != null;
      allow write: if isSuperUser();
   }
}
Run Code Online (Sandbox Code Playgroud)

我已经确认了以下作品,但它并没有那么有用......

get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role != null;
Run Code Online (Sandbox Code Playgroud)

如果有更好的方法来完成角色基础安全,我很满意.

缺乏任何调试工具使这非常令人沮丧.

firebase firebase-security google-cloud-firestore

9
推荐指数
1
解决办法
1507
查看次数

具有引用字段的Firestore安全规则

我有点卡在这里,因为没有办法调试这些规则.我很感激以下规则的帮助.

我想访问:

/modules/module-id/sessions/session-id/parts/

null第一部分的比较hasCompletedPrerequisiteSession()效果很好,第二部分没有!

该路径/modules/moduleId/sessions/sessionId/prerequisite指向参考字段.

service cloud.firestore {
    match /databases/{database}/documents {

      function hasCompletedPrerequisiteSession(moduleId,sessionId) {
                // this part works well                                   
        return getPrerequisiteSession(moduleId,sessionId) == null ||
           // !!! this part does not work !!!
           hasCompleted(getPrerequisiteSession(moduleId,sessionId).id);
      }

      function getPrerequisiteSession(moduleId,sessionId) {
        return get(/databases/$(database)/documents/modules/$(moduleId)/sessions/$(sessionId)).data.prerequisite;
      }

      function hasCompleted(sessionId) {
        return exists(/databases/$(database)/documents/progress/$(request.auth.uid)/sessions/$(sessionId));
      }

      match /modules/{moduleId}/sessions/{sessionId}/parts/{partId} {
        allow read: if hasCompletedPrerequisiteSession(moduleId,sessionId);
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

(如果我将会话ID存储为字符串而不是对会话的引用,它可以正常工作.)

编辑

问题

  1. 安全规则中的参考字段.假设modules/moduleId/owner指向该类型的字段reference.获取引用文档的id的正确方法是什么?get(../modules/moduleId).data.owner.data.id或者get(../modules/moduleId).data.owner还是其他什么东西?

firebase firebase-security google-cloud-firestore

8
推荐指数
1
解决办法
893
查看次数