W mojej aplikacji po zalogowaniu użytkownika mam authService
, który ustawia wewnętrzną flagę isAuthenticated
. Teraz przy każdej zmianie trasy mam słuchacza dołączonego do zdarzenia $routeChangeStart
, które sprawdza authService.isAuthenticated()
. Jeśli nie, powinien przekierować na trasę logowania.AngularJS - zapobiega nieuwierzytelnionemu użytkownikowi dostępu do podanych tras
Problem polega na tym, że użytkownik odświeża stronę (wszystkie ustawienia authService
są tracone) i wraca do logowania (wciąż mając ważną sesję na serwerze). Nie tego chcę.
Co chcę zrobić, to "zablokować" zmianę trasy, dopóki nie otrzymam informacji, jeśli użytkownik jest uwierzytelniony (albo od authService
, który byłby natychmiastowy, albo z serwera, jeśli informacje nie są dostępne w authService
, np. Po odświeżeniu). Mam taką funkcję w authService
// returns promise
currentUser: function() {
if (authService.isAuthenticated()) {
return $q.when(authService.loggedUser);
}
return $http.get('/session').then(function(response) {
authService.loggedUser = response.user;
return $q.when(authService.loggedUser);
});
}
i chciałby używać go w nasłuchiwania zdarzeń.
$rootScope.$on("$routeChangeStart", function (event, next, current) {
if(isRouteRestricted(next)) {
authService.currentUser().then(null, function() {
$location.path('/login');
});
}
});
Chodzi o to, że nie działa zgodnie z oczekiwaniami. Wciąż dostaję widoczną trasę celu przez bardzo krótki czas, a następnie użytkownik zostaje przekierowany. Uważam, że wynika to z natury obietnic, ale jak pozbyć się tego efektu "mrugnięcia"?
Proszę, spróbuj przeczytać ten http://stackoverflow.com/help/deleted-answers, aby uzyskać więcej informacji jak ** nie ** odpowiedzieć. Mianowicie: "Odpowiedzi, które zasadniczo nie odpowiadają na pytanie": ** niewiele więcej niż link do strony zewnętrznej ** –