Firebase: ограничить дочерний доступ на запись к сеансу браузера, который его создал

#javascript #firebase #firebase-security

# #javascript #firebase #firebase-безопасность

Вопрос:

Как я могу ограничить доступ на запись к свойству объекта в Firebase сеансу браузера, который его создал ref.push() ? Я хочу, чтобы все клиенты имели доступ на чтение к дочерним /buttonClicksByBrowserSession элементам, как я делаю в правилах безопасности ниже, и я хочу, чтобы клиенты могли отправлять дочерние /buttonClicksByBrowserSession элементы и редактировать их, но я хочу, чтобы редактирование этого дочернего элемента было запрещено после обновления браузера.

Мои правила безопасности Firebase:

 {
    "rules": {
        ".read": false,
        ".write": false,
        "buttonClicksByBrowserSession": {
          ".read": true,
          "$autoGeneratedID": {
            ".write": "newData.isNumber() amp;amp; (data.val() == null amp;amp; 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);
});
 

Ответ №1:

Используйте анонимный вход в систему, который позволяет вам назначать пользователям уникальный идентификатор для каждого сеанса, который может использоваться в правилах безопасности.

 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() amp;amp; newData.val() === (data.val()||0) 1"
    }
}
 

Ответ №2:

Для этой функциональности я думаю, что я бы выполнил простой выход из системы / вход в систему при инициализации страницы — получал новый идентификатор пользователя при каждом обновлении.

Затем сохраните данные с идентификатором пользователя в качестве последнего ключа с правилом для ограничения записи пользователю с этим идентификатором…