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

无法将Request.Auth.id与Firestore规则中的文档id匹配

隆康平
2023-03-14

我正在用Flutter开发一个应用程序。我在Firestore上有一个结构为:users/(UserID)/collection/document的数据库,这里UserID是创建(UserID)文档的用户的唯一uid。代码用于获取用户的uid is

user.uid;

其中user是FireBaseUser的实例。我试图设置这样的规则,即只有当request.auth.uid与(UserID)文档id匹配时,只有用户才能读/写。

service cloud.firestore {
  match /databases/{database}/documents {
    match /Users/{documentID} {
      allow read, write: if isOwner(documentID);
    }

    function isOwner(documentID){
        return request.auth.uid == documentID;
    }
  }
}
class EmployeeList extends StatefulWidget {
  static bool isMale;
  final String userId;
  EmployeeList([this.userId]);
  void setIsMale(bool gen) {
    isMale = gen;
  }

  bool get getIsMale => isMale;

  @override
  State<StatefulWidget> createState() => _EmployeeList();
}

class _EmployeeList extends State<EmployeeList> {
  String employeeName;

  final TextEditingController textEditingController = 
TextEditingController();
  String gender;
  int keyIndex;
  CollectionReference listColRef;
  bool firstTime;
  Firestore db = Firestore.instance;

  @override
  void initState() {
    gender = EmployeeList().getIsMale ? "Male" : "Female";
    listColRef = 
db.collection('Users').document(widget.userId).collection('EmployeeList');
    print(widget.userId);
    super.initState();
  }

 @override
 Widget build(BuildContext context) {
   return Scaffold(
      backgroundColor: Colors.grey[100],
      appBar: AppBar(
         title: Text('Employees'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(5),
        child: StreamBuilder<QuerySnapshot>(
            stream: listColRef.where('Gender', isEqualTo: 
        gender).snapshots(),

这是数据库的结构:https://imgur.com/a/ai6uiko

共有1个答案

詹杰
2023-03-14

您的数据库规则与您的查询不匹配。您的查询试图使用模式/users/{userId}/employeeList查找集合下的文档。但是您的规则只允许访问/users/{documentID}下的文档。如果希望允许访问嵌套子集合中的文档,则需要确保整个路径匹配。例如:

match /Users/{userId}/EmployeeList/{id} {
  allow read, write: if isOwner(userId);
}
 类似资料:
  • 每个食谱文档包含三个内容。一个名为的字段,其中存储菜谱的名称;一个名为的字段,其中存储创建者uid的,以及一个名为的子集合,其中包含带有一些随机字段的文档。 问题是,使用这些规则只能创建菜谱文档。子集合及其文档不会创建,因为db表示 FirebaseError:[code=permission-denied]:缺少权限或权限不足。FirebaseError:缺少权限或权限不足。

  • 我没主意了。希望新的眼光能有所帮助。 我有以下安全规则: 我正在下面的代码中设置文档: 我简直想不通。任何帮助都将不胜感激。

  • 我正在尝试将数据添加到Firebase Firestore的文档中。我向其中添加了一个名为“用户”的集合。此外,读/写权限目前已打开。我在跟踪这个医生。我无法将数据添加到文档中。 以下是我想做的: 在日志中,我只看到以下内容(无论是失败日志还是成功日志): 当我看到Firebase控制台时,根据应该创建的日志,我找不到ID的文档。 还有一个类似的问题:无法向Cloud FiRecovery添加信息

  • 在我们仔细处理之后。我仍然无法获取自动生成的文档ID。没有“then”选项。我的代码: 创建后如何获取ID?

  • 我有一个文档集合,其中文档的id是用户id。让我们称这些为用户文档。 每个“用户文档”包含聊天消息的子集合。但并不是所有的“用户文档”都包含任何字段(数据,而不是子集合)。 我不想返回集合中没有任何字段但有子集合的所有文档,但我觉得这是不可能的? 此代码只返回包含字段的文档,而不是只有子集合的文档?有没有办法全部返回? 如何获取集合中所有文档id的列表?空的和非空的都有?或者,如果我不能访问没有字

  • 我想在firestore数据库中查询文档id。目前我有以下代码: 我没有结果。但当我查询其他字段时,它会起作用: 文档id的名称是如何调用的?