当前位置: 首页 > 知识库问答 >
问题:

拒绝Firestore权限,尽管规则匹配文档集路径

呼延俊风
2023-03-14

我没主意了。希望新的眼光能有所帮助。

我有以下安全规则:

function isUser (request, userKey) {
  return request.auth.uid == userKey;
}

function isAuthorized(request){
    return request.auth.uid != null;
}

function isAdmin (request) {
  return root.child('users').child(request.auth.uid).child('isAdmin').val() == true;
}

service cloud.firestore{
    match /databases/{database}/documents {
        match /users/{uid} {
          allow create: if isAuthorized(request) || isAdmin(request);
          allow update: if isUser(request, uid) || isAdmin(request);
        }

        match /userReadable/{objectType}/{uid} {
          allow read: if isUser(request, uid) || isAdmin(request);
          allow write: if isAdmin(request);
        }

        match /userWriteable/{objectType}/{uid} {
          allow read: if isAdmin(request);
          allow write: if isUser(request, uid) || isAdmin(request);
        }

        match /userOwned/{objectType}/{uid} {
          allow read: if isUser(request, uid) || isAdmin(request);
          allow write: if isUser(request, uid) || isAdmin(request);
        }
    }
}

我正在下面的代码中设置文档:

 FirebaseFirestore db = getDB();
        PulseFirebaseModel pulse = new PulseFirebaseModel((PulseModel) object);
        try {
            final DocumentReference doc = db.collection(COLLECTION_USER_WRITABLE)
                    .document(OBJECT_PULSE_SAMPLE)
                    .collection(FirebaseApp.getInstance().getUid())
                    .document();

            doc.set(pulse, SetOptions.merge())
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if(task.isSuccessful()){
                                Log.d(TAG, "Saved sample: " + doc.getId() +"\t"+doc.getPath());
                                onSuccess();
                            }else{
                                onFailure("Could not save Ppg\t"
                                        + task.getException().getMessage()
                                        + "\ndoc Path:" + doc.getPath()
                                        + "\ndoc id: " + doc.getId()
                                        + "\n" + task.getResult());
                            }
                        }
                    });
        } catch (FirebaseApiNotAvailableException e) {
            e.printStackTrace();
        }
    }

我简直想不通。任何帮助都将不胜感激。

共有1个答案

冯开诚
2023-03-14

由于使用document()写入自动生成的文档ID,因此规则需要在路径末尾包含文档ID的通配符:

match /userWriteable/{objectType}/{uid}/{docId} { // <== added /{docId}
  allow read: if isAdmin(request);
  allow write: if isUser(request, uid) || isAdmin(request);
}
 类似资料:
  • 我的Firestore数据库有一些用户和一些s。如果没有其他人认领,用户可以认领。他们通过在上创建一个文档来声明,该文档有一个名为的字段,该字段是对他们自己的用户文档的引用。 我想我已经在这些安全规则中捕捉到了: 但是,当为所有权删除文档时,我获得了: 我是这样做的: 如果我打开read和write设置为true的文档,就不会出现此异常。 我的规则怎么了?他们用模拟器测试正常。

  • 我在编写部署在Tomcat上的Grails应用程序时遇到了一些奇怪的问题。 在创建简单的测试控制器之后,我想在包com中编写测试内容 我有个例外: 类java.io.FileNotFoundException消息/home/user/domains/domain.com/public_html/the-file-name.txt(Brak dost rpu) 我已经将chmod设置为777到。而是

  • 假设我有一个集合,其中包含子集合。餐厅权限设置在餐厅文档中,如下所示: 餐馆 任何有权访问餐厅的人也可以访问它的任何子集合,包括子集合。这是安全规则: 安全规则 查询餐厅列表可以这样完成,而且效果很好: 查询餐厅 现在如何查询子集合?我知道Firestore需要根据查询推断权限,而不查看底层数据。从逻辑上讲,这应该是可能的,因为任何可以访问的人也可以访问子集合。但是我如何组合这个子集合查询,以便F

  • 在这一点上我得到了警告: 如何让它保存文件?当我在Eclipse上创建它时,这是可行的,但是现在我更新并移到了Android Studio中,它似乎坏了一些东西。

  • 我在Kotlin构建了一个应用程序,在节点中有一个后端。js。我允许用户在客户端应用程序上使用Firebase身份验证登录/注册。 该应用程序的部分功能是让用户通过Firebase的实时数据库在线保存数据。应用程序内部发生的事情是,一旦用户登录,我就会将他/她的uid传递到后端,后端会向数据库发出请求。 当数据库的规则是允许每个人读/写时,一切都正常工作。一旦我把它们改成这样: } 我一直被拒绝许

  • 我正在用Flutter开发一个应用程序。我在Firestore上有一个结构为:users/(UserID)/collection/document的数据库,这里UserID是创建(UserID)文档的用户的唯一uid。代码用于获取用户的uid is 其中user是FireBaseUser的实例。我试图设置这样的规则,即只有当request.auth.uid与(UserID)文档id匹配时,只有用户