管理员用户的安全规则

时间:2013-10-04 07:30:46

标签: firebase angularfire firebase-security

如何设置我的安全规则,以便只有users/$provider/$user/admin == true的用户才能添加和删除新的管理员。

以下是我的Firebase规则:

{
  "rules": {    
    "users": {
      "$provider": {
        "$user": {
          "profile": {
            ".read": "$user == auth.id && $provider == auth.provider",
            ".write": "$user == auth.id && $provider == auth.provider" 
          },
          "admin": {
            ".read": false,
            ".write": false
          }
        }
      }
    },
    "blogs": {
      ".read": true,
      ".write": "root.child('users').child(auth.provider).child(auth.id).child('admin').val() == true",
      "$blog": {
        ".validate": "newData.hasChildren(['article', 'time', 'title'])"
      }
    }
  }
}

我的另一个问题是,我可以混合来自不同auth.id的{​​{1}},它们是唯一的吗?我希望删除用户层次结构中的auth.provider有点难看。

2 个答案:

答案 0 :(得分:3)

我希望我能正确理解你需要的东西:

{
  "rules": {    
    "users": {
    "$provider": {
      "$user": {
        "profile": {
          ".read": "$user == auth.id && $provider == auth.provider",
          ".write": "$user == auth.id && $provider == auth.provider" 
        },
        "admin": {
          ".read": "auth.admin == true",
          ".write": "auth.admin == true"
        }
      }
    }
    },
    "blogs": {
    ".read": true,
    ".write": "root.child('users').child(auth.provider).child(auth.id).child('admin').val() == true",
    "$blog": {
      ".validate": "newData.hasChildren(['article', 'time', 'title'])"
    }
    }
  }
}

关于第二个问题,我认为你根本不需要保存提供者,因为如果用户使用不同的提供者登录,它应该被视为新用户,除非firebase真正跟踪唯一的东西是唯一的和持久的登录这是电子邮件,我非常怀疑他们这样做。我99%肯定的赌注是,当授权提供商被切换时auth.id会发生变化,但这一点并不难以测试吗?

答案 1 :(得分:0)

虽然id属性是指定提供商的ID,但uid在所有提供商中都是唯一的,并且是您的用户的正确索引,特别是如果您使用多个提供者一次。

注意: Firebase更新了其API,不再在客户端库版本1.1.0的安全规则id变量中返回普通的,特定于提供程序的auth属性,或者之后(2014年10月3日发布)。