0

Я использую анонимную аутентификацию с моим приложением, в котором, когда пользователь открывает приложение, он/она будет аутентифицироваться, и сеанс не будет завершен после закрытия приложения.Правила Firebase для анонимной аутентификации

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

Мне удалось аутентифицировать пользователя, как показано в журналах консоли ниже.

Firebase Состав:

"rounds" : { 
    "-KBNYNvCAb-Wywq6yowW" : { 
     "Arrow1" : "1", 
     "Arrow2" : "1", 
     "Arrow3" : "2", 
     "Arrow4" : "2", 
     "Arrow5" : "1", 
     "Arrow6" : "1", 
     "Bow" : "Hoyt", 
     "Date" : 1456405827389, 
     "Distance" : "10m", 
     "RoundName" : "Dcedc", 
     "Season" : "Indoor", 
     "TotalScore" : 8, 
     "UID" : "9ddc8eb2-6f1a-4c26-bac3-b5b473104bb6" 

текущий код в считанной записи:

{ 
    "rules": { 
    "rounds": { 
     "$rounds":{ 
     ".read": "auth.uid === data.child('UID').val()", 
      ".write": "auth.uid === data.child('UID').val()" 
     } 
     } 
    } 
} 

Эта функция работает только в тренажере, когда я добавляю случайным именем таблицы в URL, например

rounds/-KBNYNvCAb-Wywq6yowW 

Контроллер, чтобы получить uid, находится в моем контроллере здесь:

 app.controller('scoreCtrl', function($scope, roundInfo, equipmentStore){ 
     ref.onAuth(function(authData) { 
      if (authData) { 
     $scope.rounds = roundInfo; 
     $scope.bow = roundInfo; 
     $scope.round = roundInfo; 
     $scope.date = new Date(); 
     $scope.addItem = function() { 
     $scope.round.$add({ 
      "RoundName": roundInfo.name, 
      "Distance": roundInfo.distance, 
      "Season": roundInfo.season, 
      "Date": this.date? this.date.getTime() : null, 
      "Bow": $scope.bow.title.title, 
      "Arrow1": roundInfo.arrow1, 
      "Arrow2": roundInfo.arrow2, 
      "Arrow3": roundInfo.arrow3, 
      "Arrow4": roundInfo.arrow4, 
      "Arrow5": roundInfo.arrow5, 
      "Arrow6": roundInfo.arrow6, 
      "TotalScore" : +roundInfo.arrow1 + +roundInfo.arrow2 + +roundInfo.arrow3 + +roundInfo.arrow4 + +roundInfo.arrow5 + +roundInfo.arrow6, 
      "UID": authData.uid 
        }); 
       }; 
      } 
     }); 
    }); 

Круглый Фабрика:

app.factory('roundInfo', function($rootScope, $firebaseArray) { 
    var roundRef = new Firebase("https://firebaseLink.firebaseio.com/rounds"); 
     roundInfo = {}; 
     roundInfo.name = ''; 
     roundInfo.bow = ''; 
     roundInfo.date = ''; 
     roundInfo.distance = ''; 
     roundInfo.season = ''; 
     roundInfo.arrow1 = ''; 

      return $firebaseArray(roundRef); 

});

Контроллеры аутентификации firebase:

 var ref = new Firebase("https://firebaseLink.firebaseio.com"); 
ref.authAnonymously(function(error, authData) { 
    if (error) { 
    console.log("Login Failed!", error); 
    } else { 
    console.log("Authenticated successfully with payload:", authData); 
    } 
    if (authData) { 
    console.log("user logged in") 
    } else { 
    console.log("user logged out:") 
    }  
}); 



    var ref = new Firebase("https://firebaseLink.firebaseio.com"); 
ref.onAuth(function(authData) { 
    if (authData) { 
    console.log("Authenticated with uid:", authData.uid); 
    } else { 
    console.log("Client unauthenticated.") 
    } 
}); 

Консоль журналов подтверждают, что пользователь был идентифицирован:

0  450893 log  Client unauthenticated. 
1  451712 log  Authenticated with uid:, 9ee68f25-d6ba-4902-9d83-329d0acf996e 
2  451713 log  Authenticated successfully with payload:, [object Object 
+0

Также отправленный: https://groups.google.com/forum/#!topic/firebase-talk/9VRyKIepMPs и HTTPS://www.reddit.com/r/Firebase/comments/47qhu1/question_firebase_rules_help/ –

+0

Ваши обновления дают понять: вы пытаетесь выполнить запрос из 'rounds', но никто не имеет разрешения на чтение в' rounds'. Мой ответ объясняет, почему это так, но это дубликат тех, на которые я ссылаюсь. Например: http://stackoverflow.com/questions/31249956/firebase-rules-cannot-access-to-each-node –

ответ

1

Ваш вопрос отсутствует какой-то важной информации (например, то, что происходит сбой операции), но я собираюсь получить обоснованное предположение.

Скорее всего, вы пытаетесь читать от rounds и стремиться вернуть только тех детей, к которым у пользователя есть доступ. Что-то вроде:

ref.child('rounds').on('child_added', function(snapshot) { 
    ... 
}) 

Это не то, как работают правила безопасности Firebase.

Чтобы иметь возможность читать или запрашивать местоположение, вы должны иметь разрешение на чтение в этом месте.

Ловушка, на которую вы упали, находится в разделе rules are not filters в документации Firebase.

Так что в ваших правилах, так как пользователь не имеет разрешения на чтение по адресу rounds, операция чтения завершится с ошибкой.Это одна из причин, почему это часто лучше хранить вещи под пользователем, который владеет им:

user_rounds 
    "9ddc8eb2-6f1a-4c26-bac3-b5b473104bb6" 
    "-KBNYNvCAb-Wywq6yowW": true 
    ... 

Некоторые вопросы, касающиеся той же самой задачи:

0

Попробуйте добавить правила чтения/записи родительских "раундов"

"rules" { 
"rounds" { 
     ".read":"true", 
     ".write":"true", 
    "$ rounds": {....}}} 

 Смежные вопросы

  • Нет связанных вопросов^_^