【问题标题】:FireBase Security Rules with User roles具有用户角色的 FireBase 安全规则
【发布时间】:2015-06-05 01:14:15
【问题描述】:

首先,我之前对此进行了研究,并且参考了之前的问题。我已经完成了这个问题中所述的事情,但没有得到积极的结果。

Firebase: set security rules depending on user roles

我正在使用:

Angular JS
Firebase
AngularFire -- Integrate Firebase with AngularJS
E-mail and Password Firebase Authentication

我在 Firebase 中有一个节点供我的用户使用:

"users" : {
  "simplelogin:49" : {
     "email" : "myemail@something.com",
     "full_name" : "First Last",
     "roles" : {
        "administrator" : true
     }
  },
  "simplelogin:64" : {
     "email" : "me@me.com",
     "full_name" : "first last",
     "roles" : {
       "administrator" : false
     }
   }
}

我正在尝试在我的客户表中添加一个条目,同时登录到simplelogin:49,如您所见,它是管理员。

// Create the Client
                var clientRef = firebaseUrl+'clients';

                var clientsListRef = new Firebase(clientRef);
                clientsListRef.push({ 
                    'uid': userData.uid,
                    'number': cl.number,
                    'company': cl.company,
                    'full_name': cl.full_name,
                    'email': cl.email,
                    'phones': {
                        'primary': cl.phones.primary,
                        'cell': cl.phones.cell,
                        'alte': cl.phones.alte
                    },
                    'addresses': {
                        'billing': {
                            'line1': cl.addresses.billing.line1,
                            'line2': cl.addresses.billing.line2,
                            'city' : cl.addresses.billing.city,
                            'state': cl.addresses.billing.state,
                            'zip'  : cl.addresses.billing.zip
                        },
                        'shipping': {
                            'line1': cl.addresses.shipping.line1,
                            'line2': cl.addresses.shipping.line2,
                            'city' : cl.addresses.shipping.city,
                            'state': cl.addresses.shipping.state,
                            'zip'  : cl.addresses.shipping.zip
                        }
                    }

                });

我在 Firebase 中为 clients 节点设置了一些规则,它们如下:

    "clients": {
       "$auth": {
          ".write": "root.child('users').child('$auth.uid').child('roles').child('administrator').val() === true"
        }
      }

我也试过这个规则:

"clients": {
  ".write": "root.child('users').child('auth.uid').child('roles').child('administrator').val() === true"
}

当我运行它时,我得到的只是一个权限被拒绝错误。如果我在 Firebase 模拟器中运行它,结果如下:

Attempt to write Success({"user":"Test"}) to /clients with auth=Success({"id":49,"provider":"password","uid":"simplelogin:49"})
/
/clients:.write: "root.child('users').child('auth.uid').child('roles').child('administrator').val() === true"
    => false

No .write rule allowed the operation.
Write was denied.

我只想知道我错过了什么。问题中的人说他/她在他们的企业中取得了成功。

【问题讨论】:

  • 不确定这是否是错误的,但至少child('$auth.uid') 应该是child($auth.uid)(所以没有引号)。 $auth 是一个变量,而 '$auth' 只是一个字符串文字。
  • 您的数据样本列出了users,但您的安全规则引用了clients。如果代码不能准确地重现产生问题所需的条件,不确定我们能提供多大帮助。见creating an mcve
  • Frank Van Puffelen -- 当我删除引号时,Firebase 会抛出一个错误,指出没有这样的方法或属性。文档也将其称为带引号的。 (firebase.com/docs/web)
  • Kato -- 我正在为引用用户节点的客户端节点设置规则。如果用户是管理员,那么该用户可以向客户端节点写入或添加客户端。
  • 显然没有人知道如何在 firebase 中使用基于角色的值

标签: javascript json firebase angularfire


【解决方案1】:

首先,您应该使用为每个用户自动生成的 Firebase 身份验证用户 ID。您将不得不查看有关如何访问经过身份验证的用户 ID 的 AngularFire 文档,但通常其内容如下:

firebase.auth().currentUser().uid

然后,一旦您使用该 id 作为字典名称创建用户,如下所示:

"users" : {
  "Rx6H4mjwwgVo6UKy2vSuOD5dTwk2" : {
     "email" : "myemail@something.com",
     "full_name" : "First Last",
     "roles" : {
        "administrator" : true
     }
  },
  "U1x3narB2AQQ0FvMxu7RVQAxb7A2" : {
     "email" : "me@me.com",
     "full_name" : "first last",
     "roles" : {
       "administrator" : false
     }
   }
}

您可以使用 Firebase 数据库安全规则中的 auth.uid 变量来获取他们的用户 ID:

"rules" : {
  "clients": {
    ".write": "root.child('users').child(auth.uid).child('roles').child('administrator').val() == true"
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-15
    • 2016-06-27
    • 1970-01-01
    • 2016-08-19
    • 2015-11-13
    • 2020-05-23
    • 2017-08-03
    相关资源
    最近更新 更多