gpt4 book ai didi

swift - Firestore : How to set security on object types with users as field names

转载 作者:行者123 更新时间:2023-11-28 05:57:26 24 4
gpt4 key购买 nike

据我了解,Firestore 不允许在数组类型的字段内进行查询,这很遗憾。因此,如果你想查询一个数组的内容,你必须将一个字段设置为对象类型,然后像映射一样设置字段,这称为嵌套映射。我想要一张 map ,其中的键是另一个用户的 ID。因此,数据库结构为:

database
users
{userId}
friends
userId1: true
userId2: true

'userId1' 和 'userId2' 字段名称将根据被列为 friend 的人的 userId 而有所不同。

问题是,我如何编写我的安全规则,以便我可以找到我的文档(通过我的 {userId})和其他用户的文档,其中我的 {userId} 是另一个“ friend ”对象中的一个字段用户的文档?

我猜它需要像..

  match /users/{userId} {
allow read, update, delete: if resource.data.userId == request.auth.uid;
allow read: if resource.data.friends.{userId} == true;
}

但这当然行不通,因为您似乎无法使用变量 {userId} 来命名要对其执行测试的字段。那么,如果无法做到这一点,有什么方法可以搜索文档并将我的 {userId} 以某种方式存储在其他人的文档中?


编辑


好吧,我想我已经确定了规则(见下文)。但是,在尝试测试这些规则时,我似乎无法编写 Swift 调用来检索基于该 friend 对象的数据。我的 Swift 电话是:

db.collection("users").whereField(FieldPath(["friends.\(userId)"]), isEqualTo: true)

所以,我的问题是:

  1. 下面的规则是否正确?
  2. 如何进行 Swift 调用以查找在对象类型的字段名称中具有特定 userId 的人?

    服务云.firestore { 匹配/databases/{database}/documents { 匹配/users/{documentId} { 允许读、写:if isOwner();
    允许读取:if getFriend(request.auth.uid) == true;

            function isOwner() {
    return request.auth.uid == resource.auth.uid;
    }

    function getFriend(userId) {
    return getUserData().friends[userId]
    }

    function getUserData() {
    return get(/databases/$(database)/documents/rooms/{documentId}).data
    }
    }
    }

最佳答案

我仍然没有解决访问对象字段的问题,但注意到我的安全规则通常无效。您不能有多行具有相同的规则类型,例如,您不能有多行带有“允许:读取”。您必须使用 && 和 ||。例如,如果要检查两件事,基本规则的正确定义是:

// Database rules
service cloud.firestore {
// Any Cloud Firestore database in the project.
match /databases/{database}/documents {
// Handle users
match /users/{documentId} {
// The owner can do anything, you can access public data
allow read: if (isOwner() && isEmailVerified()) || isPublic();
allow write: if isOwner() && isEmailVerified();

// Functions //
function isSignedIn() {
return request.auth != null;
}

function isOwner() {
return request.auth.uid == resource.data.userId;
}

function isPublic() {
return resource.data.userId == "public";
}

function isEmailVerified() {
return request.auth.token.email_verified
}
}
}
}

关于swift - Firestore : How to set security on object types with users as field names,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51034293/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com