Firebase数据结构和安全规则

时间:2015-12-07 14:45:41

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

我遇到了firebase安全规则的问题,而且我不是100%我错的地方。我想也许我的数据结构错了:

if(data.cust)
{
   $.each(data.cust,function(indx,item){    
         alert(item.email);        
   });
}

应用程序中的所有内容都可以正常工作,但当我开始添加安全规则时,我获得了访问被拒绝的错误。我只是想知道我的数据结构是否正确,或者安全规则是否完全错误?

安全规则:

{
"users": {
    "uid": {
        "displayName": "Name";
    }

},
"modules": {
    "id": {
        "title": "buttons",
        "uid": "(user id string)"
    },
    "id": {
        "title": "navbars",
        "uid": "(user id string)"
    }
},
"snippets": {
    "id = moduleID": {
        "id (of snippet)": "(id string)" {
            "uid (user ID)": "(string)",
            "body": {
                "css": "(some code)",
                "html": "(Some code)",
                "name": "(string)",
                "description": "(string)"
            }
        }
    }
}

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:1)

根据数据结构,似乎规则格式不正确。

规则在每个节点中都有$ uid,但您的数据并不匹配。用户有uid,但模块有id,snippets有id = moduleID。

$ uid是一个保存节点名称的变量,因此它可以在{}内引用,因此您应该(为了便于阅读)将其他两个节点中的变量重命名为在每个{}内更有意义的内容。就像模块一样,请使用$ module_id。

然而。我认为这是你想要将读取片段和模块限制为经过身份验证的用户。为此,您可以引用用户节点。

.read规则就是这样的

"modules": {
    "$module_id": {
        ".read": "auth != null && root.child('users/' + auth.id).exists()
    }

因此,您的模块节点可以由auth&d用户读取,并且他们的uid也会出现在用户/节点中

答案 1 :(得分:0)

您是否将Firebase Bolt编译器用于规则?我不得不写一些复杂的规则,手工制作很快就会让人感到困惑。

下面是它的样子。很容易进行更改,编译并试用它们。

Feature: Test the validation on the person object

  Background:
    Given the language is 'english'

  Scenario: Create a person with firstName empty and check we have a violation error message on it
    Given we create a new person
    And we set firstName ''
    And we set lastName 'smith'
    When we apply validation
    Then we should have 1 violation
    And we should have a  error message on 'firstName' that says 'may not be empty'

这是它吐出的json:

//current logged in user
isUser(uid) = auth != null && auth.uid == uid;
//does this module id exist
hasValidModule(module_id) = root['modules'][module_id] != null;

//dont let anyone read or write to top node
path / {
    read() = false;
    write() = false;
}
path /users/$user_id 
{   
    write() = isUser($user_id);
    read() = isUser($user_id);
}
path /snippets/$module_id/$snipit_id/$user_id 
{   
    write() = isUser($user_id) && hasValidModule($module_id);
    read() = isUser($user_id);
}
path /modules/$user_id 
{   
    write() = isUser($user_id);
    read() = isUser($user_id);
}

Firebase博客上有一些信息,但真正帮助我的文档是

https://github.com/firebase/bolt/blob/master/docs/language.md