如何只允许“拥有”数据的用户进行编辑?火力

时间:2016-06-25 09:33:52

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

我有这个数据结构:

enter image description here

我想要一个Firebase规则,允许拥有代码段的用户能够编辑,但不能编辑其他人。所以在某种程度上,它的工作方式如下:

  • 在添加数据之前,每个人都有权添加特定语言
  • 添加时,只有'所有者'允许编辑

我将如何仅允许创建的用户(例如Javascript代码段)进行编辑?

1 个答案:

答案 0 :(得分:5)

如果我正确理解您要查找的内容,$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上的写规则我强烈建议您从代码分支移动代码段分支,因为您要为单个节点添加更多复杂性。您将开始使用这种复杂的规则逻辑来处理,您的应用程序代码也将被这种结构所淹没。

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

{
    "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