【问题标题】:How to only allow the user who “owns” the data to edit it? firebase如何只允许“拥有”数据的用户对其进行编辑?火力基地
【发布时间】:2016-10-27 21:02:39
【问题描述】:

我有这个数据结构:

我想要一个 Firebase 规则,允许拥有代码 sn-p 的用户能够编辑,但其他人不能。所以在某种程度上,它会像这样工作:

  • 在添加数据之前,每个人都可以添加特定语言
  • 添加时和添加后,仅允许“所有者”编辑

我将如何只允许创建的用户,比如 Javascript sn-p 来编辑它?

【问题讨论】:

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


    【解决方案1】:

    如果我正确理解你在寻找什么,你的$language 写入规则将如下所示:

    {"rules":{
        "codes":{
            "$codeId":{
                "snippets":{
                    "$language":{
                        ".write": "(!data.exists() && newData.child('uid').val() == auth.uid ) || (data.child('uid').val() == auth.uid && newData.child('uid').val() == auth.uid)"
                    }
                }
            }
        }
        }
    }
    

    更新:

    在添加了您仍然需要在 /codes/$codeId 上的写入规则之后,我强烈建议您将 sn-ps 分支从代码分支中移出,因为这会增加单个节点的复杂性。您将开始处理这种复杂的规则逻辑,并且您的应用程序代码也将被这种结构所淹没。

    尝试使用更不耦合的东西,例如下面的结构:

    {
        "rules":{
            "codes":{
                "$codeId":{
                    ".write": "true",
                    "snippets":{
                        "$snippetID":{
                        }
                    }
                }
            },
            "snippets":{
                "$snippetID":{
                    "$language":{
                        ".write": "(!data.exists() && newData.child('uid').val() == auth.uid ) || (data.child('uid').val() == auth.uid && newData.child('uid').val() == auth.uid)"
                    }
                }
            }
        }
    }
    

    说明

    根据要求,我正在为这个特定的写入逻辑添加一些细节。

    根据我得到的要求,如果用户正在写入新数据或者他“拥有”他正在尝试写入的数据,则他可以写入

    !data.exists() || data.child('uid').val() == auth.uid
    

    由于“拥有”数据意味着该数据具有所有者 uid,因此我假设如果他正在编写数据,则用户 uid 需要始终存在。这就是我添加newData.child('uid').val() == auth.uid 的原因。 (请记住,newData 表示用户正在尝试写入的数据)。

    (!data.exists() && newData.child('uid').val() == auth.uid ) || (data.child('uid').val() == auth.uid && newData.child('uid').val() == auth.uid)
    

    我可以将其规范化为波纹管以避免newData 检查逻辑的两侧,但至少对我来说,它更容易理解。

     (!data.exists() || data.child('uid').val() == auth.uid) && newData.child('uid').val() == auth.uid
    

    【讨论】:

    • 还有别的办法吗?我尝试将传入数据的 uid 与现有数据的 uid 进行比较。
    • 我会的。目前不落后于电脑。感谢您提供代码 sn-p。回家后马上试试。
    • 谢谢。现在工作。我前面有一条规则推翻了$language 部分的代码编写规则。谢谢
    • @Rexford 不错!很高兴你取得了进展:)
    • @Rexford 看看编辑,如果您有任何疑问,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2016-09-17
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    相关资源
    最近更新 更多