2015-06-10 27 views
9

Więc ilekroć wylogować z Firebase, mam połączonyWylogowanie z Firebase show Błąd odmowy uprawnień.

Error: permission_denied: Client doesn't have permission to access the desired data. 

Rozumiem to dlatego sesja logowania jest zakończona, niektóre z moich przedmiotów nie może uzyskać dostępu do danych Firebase więcej. Ale jak mogę odłączyć te obiekty przed wylogowaniem?

Dla przycisku wylogowania w jednym z moich Ionic widzenia, to właśnie nazywamy Firebase usługę:

function logout() { 
     auth.$unauth(); 
     getCurrentUser(); 
}; 
function getCurrentUser() { 
     var authData = auth.$getAuth(); 
     if (authData) { 
      $rootScope.userId = authData.uid; 
      $rootScope.currentUser = $firebaseObject(authRef.child("users").child(authData.uid)); 
      return $rootScope.currentUser; 
     } else { 
      console.log("User is not login!"); 
      $rootScope.userId = null; 
      $location.path("/auth/signin"); 
      if ($rootScope.currentUser) { 
      $rootScope.currentUser.$destroy(); 
      } 
     } 
    }; 

Więc zniszczyć $ rootScope.currentUser tam. Używam tego samego getCurrentUser dla strony profilu. Błąd nie pojawił się w ten sposób. Ale gdy w innych widokach, które mam inny $ firebaseArray, a także inny Ref.on ("child_added", funkcja (przystawki) z tym samym $ firebaseObject. Kiedy przeglądam stronę profilu, to ta strona z co najmniej 3 firebase połączenia , Mam 3 błędy allow_denied, gdy się wylogowuję (przycisk wylogowania znajduje się na stronie profilu użytkownika)

Moje pytanie brzmi: jak mogę odłączyć to połączenie firefase przed wylogowaniem? Czy istnieje sposób na rozłączenie WSZYSTKIEGO połączenia z firebase - bez względu na to, AngularFire lub zwykłą Firebase? Czy mogę się wylogować bez martwienia się o to, które połączenie z firewallem nie mam jeszcze blisko? Ponadto, ponieważ przycisk Logout znajduje się w zasięgu Profilu, a pozostałe połączenia mają inny zakres, nie mam pojęcia, jak zamknąć połączenie który nie jest nawet w zakresie profilu ...

+0

Czy robisz coś, używając "$ onAuth"? Może w twojej fabryce? – jbdev

+0

Tak, mam. Ale używanie onAuth nadal nie będzie wiedzieć, co powinienem zamknąć podczas wylogowywania. Ponieważ moje instancje są wszędzie. I większość z nich nie mogę zamknąć podczas widoku urlopu, ponieważ wszyscy muszą słuchać aktualizacji z firebase. –

Odpowiedz

0

dobrze, myślę, że masz przycisk do wylogowania. więc w funkcji logout() najpierw $ zniszczyć obiekt danych, jakoś poczekać (najlepsza praktyka, którą próbuję wymyślić), a następnie authref.unauth(); Powiedziałbym, że

+0

Wszystko - Miałem ten sam problem i szybka korekta polegała na aktualizacji reguł {".read": true}, tylko w celu uzyskania dostępu do odczytu, nieco podobnego postu można uzyskać pomysł na rozwiązanie go w prosty sposób http: // przepełnienie stosu.com/questions/14296625/ograniczenie-dostępu-do-pola-z-regułami bezpieczeństwa Istnieje kilka innych przykładów rozwiązania tego problemu przez napisanie dekoratora i zniszczenie wszystkich referencji firebase utworzonych za pomocą $ firebaseArray i $ firebaseObject. –

2

Musisz zniszczyć wszystkie referencje bazy firewall podczas wylogowywania. Coś takiego.

W funkcji wylogowania.

function logout() { 
     auth.$unauth(); 
     $rootScope.$broadcast('logout'); 
}; 

W kontrolerze

vm.profile = authService.profile(user.uid); // FirebaseObject Reference 
vm.parties = partyService.getPartiesByUser(user.uid); // FirebaseArray Reference 

$rootScope.$on('logout', function() { 
    vm.parties.$destroy(); 
    vm.profile.$destroy(); 
}); 
+0

To może być rozwiązanie. Ale użycie $ rootscope wydaje się trochę odurzające. –

+0

Używając $ rootScope możesz nadać zdarzenie wylogowania we wszystkich kontrolerach. –

+0

Jeśli zniszczysz odniesienia do bazy firebase, potrzebujesz sposobu na reinicjalizację fabryki/usług/kontrolerów, w których zdefiniowane są twoje referencje. Jeśli nie, brak danych po wylogowaniu i ponownym zalogowaniu się. –

-1

Trzeba zniszczyć Firebase ref dla obiektu, który został zapisany wcześniej danych. W jaki sposób?

Wcześniej inicjalizuję moje utwory w stylu zmiennym, takie jak: this.songs = this.af.list ('/ songs'); .

Kiedy SignOut(), powinienem zniszczyć odniesienie zmiennej że zainicjowany tak, że mogę wykonać:

this.songs $ ref.off();

W tej linii Twój problem: