AngularJS | gérer le routage avant qu'ils ne se chargent
Je souhaite créer un simple contrôle d'authentification pour mes itinéraires en service externe.
J'définir les conditions d'accès sur la route de l'objet:
$routeProvider
.when('/', {
templateUrl: 'src/app/views/index.html',
controller: 'indexCtrl',
authenticated: true
})
.when('/login', {
templateUrl: 'src/app/views/login.html',
controller: 'loginCtrl',
anonymous: true
})
.otherwise({
redirectTo: '/'
})
;
Ensuite, je vérifie si j'ai la permission au sein de la $routeChangeStart
événement.
$rootScope.$on('$routeChangeStart', function (event, next) {
if(next.authenticated && !$myService.isLoggedin())
$location.path("/login");
else if(next.anonymous && $myService.isLoggedin())
$location.path("/secured");
});
En fait, il fonctionne-
si l'utilisateur non authentifié il le déplacer vers la page de connexion, s'il est authentifié, mais la route est pour les utilisateurs anonymes seulement, il les déplacer vers une autre page, et etc..
MAIS cette redirection qui se passe vraiment après les contrôleurs et les modèles de charge!
Et il la cause de mon contrôleur pour faire quelques inutiles demande à mon API REST, même si je ne suis pas authentifié.
Comment puis-je gérer la route avant qu'ils procédé?
source d'informationauteur Almog Baku
Vous devez vous connecter pour publier un commentaire.
Utilisation $routeProvider résoudre
Ma solution fut de combiner
$locationChangeStart
et$routeChangeStart
:J'ai copié
parseRoute()
deangular-route.js
pour analyser l'URL donnée pour la route..Puis-je construire mon login vérifier gestionnaire(
Auth.loginCheck
) que si elle échoue, elle renvoie false.J'utilise aussi
$routeChangeStart
pour gérer$route.reload()
événements, de sorte que maintenant, après chaque changement au sein de mon statut d'authentification je viens de faire$route.reload()
:Enfin j'ai juste assurez-vous que ce service personnalisé est toujours en utilisant de simples
run()
méthode.Edit:
Nous maintenant à l'aide de ngAuth, un module que nous avons conçu pour résoudre ce problème exact(basé sur la réponse que j'ai donné ici avant).
Enfin, nous avons développé un angulaires-le module qui a résolu ce problème.. Ce module est basé sur la réponse que j'ai publié ici avant.
En raison des demandes ici, nous avons publié une version bêta qui travaille maintenant: http://github.com/GoDisco/ngAuth
Sentir libre de l'utiliser.
Angularjs résoudre exemple:
Angulaires-http-auth, vous permettent de gérer très élégamment autorisation sur HTTP niveau (lors de l'extraction de modèle) et de l'invite de connexion si nécessaire. Tout cela sans même chargement du modèle (ni contrôleur) si l'autorisation est refusée. Clairement la meilleure chose que j'ai vu jusqu'à présent.
https://github.com/witoldsz/angular-http-auth
Essayez d'utiliser
resolve
propriété de la route. Il résout toutes les fonctions/dépendances est passé avant n'importe quel contrôleur ou le modèle est chargé.Au cas où la dépendance renvoie une promesse, jusqu'à ce que son rien résolu en est chargé.
Essayer de passer votre service d'authentification à résoudre et de les rediriger en cas d'auth échec.
Regardez -> https://groups.google.com/forum/#!topic/angulaire/QtO8QoxSjYw
$stateProvider utilise $routeProvider dessous. Ce wiki va vous donner plus d'informations. https://github.com/angular-ui/ui-router/wiki#resolve