2

如何设置我的安全规则,以便只有拥有的用户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不同auth.provider的,它们是独一无二的吗?我想在用户层次结构中删除"$provider": {}它有点难看。

4

2 回答 2

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当身份验证提供者切换时会发生变化,但这一点也不难测试,是吗?

于 2013-10-05T08:27:37.193 回答
0

虽然该id属性是指定提供者的 id,但uid它在所有提供者中都是唯一的,并且旨在作为用户的正确索引,尤其是在您同时使用多个提供者的情况下。

注意: Firebase 更新了他们的 API,不再在客户端库版本 1.1.0 或更高版本(2014 年 10 月 3 日发布)id的安全规则变量中返回一个简单的、特定于提供程序的属性。auth

于 2014-10-06T23:18:33.797 回答