Redirection vers la route si l'utilisateur n'est pas authentifié
Je suis en train de propreté, de mettre en place un moyen de rediriger l'utilisateur vers un login route si elles n'êtes pas connecté. Je suis en fondant ma solution sur un autre AFIN de répondre à ici qui ne fonctionne pas hors de la boîte. Voici ma solution.
angular.module('myApp', ['ngResource', 'ngRoute'])
.config(['$routeProvider', function ($routeProvider) {
var requireAuthentication = function () {
return {
load: function ($q) {
console.log('Can user access route?');
if (g_isloggedIn === true) { //fire $routeChangeSuccess
var deferred = $q.defer();
deferred.resolve();
console.log('Yes they can!');
return deferred.promise;
} else { //fire $routeChangeError
console.log('No they cant!');
return $q.reject("'/login'");
}
}
};
};
$routeProvider
.when('/some_page_that_requires_authentication', {
templateUrl: '/views/secret.html',
controller: 'secretCtrl',
resolve: requireAuthentication()
})
.when('/anybody_can_see_me', {
templateUrl: '/views/public.html',
controller: 'publicCtrl',
});
}]);
Ma question est, où puis-je écouter sur le $routeChangeError
événement afin que je puisse rediriger la route? J'ai essayé de le faire dans une directive, mais ne pourrait jamais obtenir cas d'incendie. Je ne peux pas le mettre dans un contrôleur, car il ne se charge pas si la promesse est rejetée. Toutes les pensées?
Vous devriez être en mesure de l'observer à n'importe quel contrôleur (ou directive) qui se trouve à l'extérieur de
pouvez même le mettre dans
ng-view
élément.pouvez même le mettre dans
run()
...léger bug dans votre code...besoin d'appeler $q.defer();
avant votre if
OriginalL'auteur w.brian | 2013-12-11
Vous devez vous connecter pour publier un commentaire.
Est-il une raison pourquoi vous ne devriez pas rediriger l'utilisateur à partir de l'intérieur de la fonction?
Cela fonctionne très bien pour moi, il ne prend pas en charge le contrôleur /vue, si la promesse n'est pas résolu.
J'ai modifié la fonction comme ceci:
dans l' .config() bloc peut-être? Comme dans la question. Ou quelque part le champ? Juste de sorte qu'il est disponible.
OriginalL'auteur wiherek
Vous pourriez trouver de l'aide dans cette question: AngularJS: Compréhension $rootScope.$('$routeChangeSuccess
En général, je sens que l'utilisation de "résoudre" pour assurer l'authentification est un peu bizarre, mais il n'y a pas beaucoup de meilleurs moyens, je suggère l'ajout de certains services, etc. Qui est d'ailleurs le point.
Enfin, d'autres solutions de routage comme https://github.com/dotJEM/angular-routing peut vous fournir un meilleur degré de contrôle.
OriginalL'auteur Jens
Je suis sûr que vous êtes bien au-delà de ce problème, mais pour ceux à la recherche de réponses maintenant, voici mes deux cents.
La seule chose qui vous manque, voici ce qui se passe quand la promesse est rejetée. Vous aurez envie de le faire avec HTTP interception. Vous mettre un listener sur routeChangeError, et de les rediriger. https://docs.angularjs.org/api/ng/service/$http (défiler vers le bas pour les intercepteurs de la section)
OriginalL'auteur Kraken