【问题标题】:Firebase Security Rules - prevent duplicate friend requestFirebase 安全规则 - 防止重复的好友请求
【发布时间】:2017-03-06 09:42:09
【问题描述】:

对于我的 iOS 应用,我允许用户发出原则上类似于 Facebook 好友请求的好友请求。因此,某人可以有 x 个朋友。

我想阻止用户向同一用户发送多个好友请求,并希望通过在数据库规则中添加验证规则来做到这一点 - (我还没有探索拥有另一个列表的选项然而)

我目前的验证规则是防止用户向自己发送好友请求。

下面是数据库的结构,我需要检查“fromUid”和“toUid”的值是否已经成对存在。

    "requests" : {

        "-KUr12h72I4T2WiI4JG0" : { // autoChildId

             "fromUid" : "etOdpR0wpKYNFrIP7BNirhCYuYo1",
             "toUid" : "UeATHfKdjVYunsOt8L0TGxfCBTQ2"
    }

我的当前规则禁止用户向自己发送好友请求

    "requests": {
        ".read": "auth != null",
        "$autoID": {
            ".validate": "newData.child('fromUid').val() != newData.child('toUid').val()"
         }
    },

那么,我如何验证“fromUid”值和“toUid”值尚未成对存在?即尚未提出此好友请求。

这是我对安全规则的失败尝试:

        ".validate": "&& newData.child('fromUid').val() + newData.child('toUid').val() !== data.child('fromUid').val() + data.child('toUid').val() && newData.child('toUid').val() + newData.child('fromUid').val() !== data.child('toUid').val() + data.child('fromUid').val()"

如果您需要更多信息或说明,请告诉我 谢谢

【问题讨论】:

    标签: firebase firebase-realtime-database firebase-security


    【解决方案1】:

    良好(且正确)的数据库结构占项目的一半以上。如果你设计的数据库结构不好,你会遇到很大的麻烦,尤其是当你使用 NOSQL 数据库时。如果您事先花时间设计数据库,您以后会很开心。

    你应该设计项目并事先考虑你需要什么操作,你想如何展示数据谁有什么角色,并根据它设计你的firebase数据库。

    我的建议是阅读以下关于从 firebase 文档中构建数据的页面。

    https://firebase.google.com/docs/database/web/structure-data

    关于您的问题

    我建议通过fromUid修改数据库结构和分组toUids。

    {
        "requests": {
            // user Ids who sent request
            "userId1": {
                // receiver ids
                "userId2": true,
                "userId3": true,
                "userId4": true
            },
            "userId2": {
                "userId3": true,
                "userId4": true
            }
        }
    }
    

    在这里重复请求是不可能的。您要做的唯一检查是用户无法向自己发送请求。

    这是规则。

    "requests": {
      ".write": "auth != null",
      "$senderId": {
        "$receiverId": {
          ".validate": "$senderId !== $receiverId"
        }
      }
    }
    

    使用这种结构,您还可以轻松地进行其他操作。例如通过fromUid 获取所有请求。检查userId1是否向userId2发送请求等

    【讨论】:

    • 不知道为什么要按照我的方式构建数据。在这种情况下,不需要添加 autoByChildId() 键并随后具有 toUid 和 fromUid 节点,因为用户的 uid 是唯一的并且它是事件之一。这种结构让事情变得更容易:),干杯
    • 太棒了!...如果您接受答案并单击上箭头,那就太好了。这将帮助其他人知道这个答案很有用
    • 刚刚做了 - 抱歉还是新手 - 不幸的是我不能投票,因为我还没有声誉
    • 好的。保持活跃,您的声誉就会提高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多