2015-06-10 2 views
9

Поэтому, когда я выйти из Firebase, я получил в сочетанииВыход из системы Firebase Разрешение отклонено.

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

Я понимаю, что это происходит потому, что Логин сеанс завершается, некоторые из моих объектов не может получить доступ к данным firebase больше. Но как я могу отключить эти объекты до выхода из системы?

Для кнопки выхода из системы в одном из моих Ионных View, это просто позвонить firebase услуги:

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(); 
      } 
     } 
    }; 

Так что я уничтожить $ rootScope.currentUser там. Я использую тот же getCurrentUser для страницы профиля. Таким образом, Ошибка не появилась. Но когда в других представлениях, у которых у меня есть еще $ firebaseArray, а также еще одна функция Ref.on («child_added», функция (snap) с тем же $ firebaseObject. Когда я просматриваю страницу профиля, тогда эта страница содержит как минимум 3 соединения firebase , Я получил 3 разрешения_определенных ошибок при выходе из системы (кнопка выхода на страницу профиля пользователя).

Мой вопрос: как отключить это соединение firebase до выхода из системы? Есть ли способ отключить ВСЕ подключение firebase - неважно AngularFire или обычная Firebase? Поэтому я могу выйти из системы, не беспокоясь о том, какое соединение firebase у меня еще нет? Также, поскольку кнопка «Выход» находится в области «Профиль», а другое - в другой области, я понятия не имею, как закрыть соединение что даже не в области профиля ...

+0

Вы делаете что-нибудь, используя «$ onAuth»? Может быть, на вашем автозаводе? – jbdev

+0

Да, да. Но использование onAuth по-прежнему не будет знать, что я должен закрыть при выходе из системы. Поскольку мои примеры повсюду. И большинство из них я не могу закрыть, когда оставляю вид, так как все они должны слушать обновление от firebase. –

ответ

0

ну, я думаю, у вас есть кнопка выхода из системы. , поэтому в вашей функции logout() вы должны сначала уничтожить объект данных, как-то подождать (лучше всего использовать эту методику, чтобы выяснить), а затем authref.unauth(); Я бы сказал,

+0

Все - у меня была такая же проблема, и было бы быстрым решением было обновить правила {".read": true}, только для доступа к чтению, несколько похожего сообщения вы можете получить идею, чтобы решить это простым способом http: // переполнение стека.com/questions/14296625/ruleing-child-field-access-with-security-rules Есть еще несколько примеров для решения этой проблемы путем написания декоратора и уничтожения всех ссылок на firebase, созданных с помощью $ firebaseArray и $ firebaseObject. –

2

Вам необходимо уничтожить все ссылки на базовую станцию ​​при выходе из системы. Что-то вроде этого.

В функции выхода из системы.

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

В контроллере

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

Это может быть решение. Но использование $ rootcope просто кажется немного взломанным. –

+0

Используя $ rootScope, вы можете транслировать событие выхода во всех контроллерах. –

+0

Если вы уничтожаете ссылки на firebase, вам нужно каким-то образом повторно инициализировать фабрику/службы/контроллеры, где указаны ваши ссылки. Если вы этого не сделаете, нет данных после выхода из системы и входа в систему. –

-1

Вы должны уничтожить firebase реф для объекта, который вы сохранили данные ранее. Как?

Раньше я инициализировал свои var-песни как: this.songs = this.af.list ('/ songs'); .

Когда я SignOut(), я должен уничтожить ссылку переменной, что я инициализируется так, что я выполняю:

this.songs $ ref.off();

С этой линией ваша проблема

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