Firebase:限制孩子对创建它的浏览器会话的写入权限

时间:2014-06-21 00:09:39

标签: javascript firebase firebase-security

如何将对Firebase中对象属性的写入权限限制为使用ref.push()创建它的浏览器会话?我希望所有客户都能像我在下面的安全规则中对/buttonClicksByBrowserSession的孩子有读取权限,我希望客户能够将孩子推到/buttonClicksByBrowserSession并进行编辑,但我想要修改浏览器刷新后不允许该孩子使用。

我的Firebase安全规则:

{
    "rules": {
        ".read": false,
        ".write": false,
        "buttonClicksByBrowserSession": {
          ".read": true,
          "$autoGeneratedID": {
            ".write": "newData.isNumber() && (data.val() == null && newData.val() === 1 || newData.val() - data.val() === 1")
          }
        }
    }
}


我的JS:

var fbRef = new Firebase('https://fbKey.firebaseIO.com/buttonClicksByBrowserSession');
var numClicksRef = fbRef.push();
var numClicks = 0;

button.addEventListener('click', function() {
    numClicksRef.set(++numClicks);
});

2 个答案:

答案 0 :(得分:1)

利用anonymous login,允许您为用户分配可在安全规则中使用的每会话唯一ID。

var fb = new Firebase(URL);
var auth = new FirebaseSimpleLogin(fb, function(err, user) {
   if( err ) throw err;
   if( user ) init(user);
});

function init(user) {
   fb.child('buttonClicksByBrowserSession/'+user.uid).transaction(function(currValue) {
      return (currValue||0)+1;
   });
}

auth.login('anonymous', {rememberMe: false});

安全规则:

"buttonClicksByBrowserSession": {
    ".read": true,
    "$autoGeneratedID": {
       ".write": "auth.uid === $autoGeneratedID",
       ".validate": "newData.isNumber() && newData.val() === (data.val()||0)+1"
    }
}

答案 1 :(得分:0)

对于此功能,我认为我在页面初始化中进行了简单的注销/登录 - 每次刷新都会获得一个新的用户ID。

然后使用userid作为最终密钥保存数据,并使用规则限制对具有该ID的用户的写入...