Nella mia app quando l'utente ha effettuato l'accesso, ho authService
che imposta la bandiera interna isAuthenticated
. Ora su ogni cambio di percorso ho ascoltatore collegato all'evento $routeChangeStart
che controlla authService.isAuthenticated()
. Se no, dovrebbe reindirizzare al percorso di accesso.AngularJS - impedisce all'utente non autenticato di accedere a determinate route
Il problema si verifica quando l'utente effettua l'aggiornamento della pagina (tutte le impostazioni authService
vengono perse) e ritorna di nuovo al login (pur mantenendo una sessione valida sul server). Questo non è quello che voglio.
Quello che mi piacerebbe fare è "bloccare" il cambio di rotta fino a quando non ottengo le informazioni se l'utente è autenticato (o da authService
che sarebbe immediato, o dal server se nessuna informazione è disponibile in authService
, ad esempio dopo l'aggiornamento). Ho una tale funzione nel 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);
});
}
e vorrei usarlo in listener di eventi.
$rootScope.$on("$routeChangeStart", function (event, next, current) {
if(isRouteRestricted(next)) {
authService.currentUser().then(null, function() {
$location.path('/login');
});
}
});
Il fatto è che non funziona come previsto. Ricevo ancora la rotta target visibile per un tempo molto breve, quindi l'utente viene reindirizzato. Credo che sia dovuto alla natura delle promesse, ma come sbarazzarsi di questo effetto "blink"?
Per favore, prova a leggere questo http://stackoverflow.com/help/deleted-answers, per capire meglio come ** non ** rispondere. Vale a dire: "Risposte che non rispondono fondamentalmente alla domanda": ** a malapena più di un link a un sito esterno ** –