angularjs rediriger vers la page de login si pas authentifié avec des exceptions

EDIT: j'ai oublié de mentionner que j'ai travaillé avec AngularJs pour une semaine seulement, donc si vous voyez quelque chose que vous pensez qui pourrait être changé pour le mieux et n'est pas liée à la question elle-même hésitez pas à me dire sur la section des commentaires.


ok, donc j'ai mon authentification Contrôleurs et les fournisseurs qui ne montrent pas parce qu'ils sont sans pertinence pour la portée de la question.
Alors j'ai un intercepteur de vérifier si l'utilisateur est authentifié lorsqu'un Appel est effectué. Si j'ai donc mis le Authentication en-tête sur la demande d'inclure le Jeton de l'utilisateur si non je redirige l'utilisateur vers la page de connexion et de ne même pas faire la demande sur le serveur (évidemment, si quelqu'un ignore ce theres également une Authorize sur l'API).

Ce que je veux, c'est pour ajouter un peu d'exceptions près, sens il y a quelques pages, je veux permettre, même si l'utilisateur n'a pas de Jeton d'Authentification. Je suis capable de cela si c'est un chemin d'accès spécifique, mais j'aimerais que ma page 404 pour être accessible et c'est dans la Routing que je suis en précisant .otherwise pour aller à la page 404, comment puis-je faire pour que mon intercepteur seulement redirige vers la connexion, si elle n'est pas d'aller à cette page.

L'intercepteur

.factory('authInterceptorService', ['$q', '$location', 'localStorageService', function ($q, $location, localStorageService) {

    var authInterceptorServiceFactory = {};

    var authData = localStorageService.get('authorizationData');

    var _request = function (config) {

        config.headers = config.headers || {};

        if (authData) {
            config.headers.Authorization = 'Bearer ' + authData.token;
        } else if ($location.path != '/accounts/login' && $location.path != '/accounts/register') {
            $location.path('/accounts/login');
        }

        return config;
    }

    var _responseError = function (rejection) {
        if (rejection.status === 401) {
            $location.path('/accounts/login');
        }
        return $q.reject(rejection);
    }

    authInterceptorServiceFactory.request = _request;
    authInterceptorServiceFactory.responseError = _responseError;

    return authInterceptorServiceFactory;
}])

et dans mon Routage

 $urlRouterProvider.otherwise('/page-not-found');

 $stateProvider
     (...)//rest of the states

     .state('page-not-found', {
         url: '/page-not-found',
         templateUrl: '/Content/partials/error/404.html',
         data: {
             displayName: false
         }
     })

     (...)//rest of the states

J'ai essayé d'ajouter '/page-not-found' à mon if mais il ne fonctionne pas comme prévu car au moment où l'emplacement est vérifié pour la première fois, il n'est toujours pas redirigé.

modifier
Comme suggéré par charlietfl je vais maintenant essayer d'utiliser les résoudre, mais il n'est même pas passer le reste de ma fonction.

J'ai enlevé ce code à partir de mon intercepteur:

else if ($location.path != '/accounts/login' && $location.path != '/accounts/register') {
    $location.path('/accounts/login');
}

et ajouter un nouveau service pour le module d'authentification:

.service('authCheckService', ['$http', '$q', 'localStorageService', function ($http, $q, localStorageService) {
    var self = {
        'onlyLoggedIn': function ($state, $q) {
            var deferred = $q.defer();
            var authData = localStorageService.get('authorizationData');
            console.log(authData);
            if (authData) {
                deferred.resolve();
            } else {
                deferred.reject();
                $state.go('login');
            }
            return deferred.promise;
        }
    }

    return self;
}]);

et je suis en train de l'appeler comme:

.state('smo-dashboard', {
        url: '/dashboard',
        templateUrl: '/Content/partials/dashboard.html',
        resolve: authCheckServiceProvider.onlyLoggedIn
})

avis que je suis en train de journal authData var pour vérifier si ça fonctionne mais ça ne l'est pas et il n'y a pas d'erreur sur la console.

  • une suggestion est d'avoir un parent de l'état pour tous les chemins qui exigent une connexion. Ensuite, vous pouvez avoir un resolve sur le parent, et si l'utilisateur n'est pas connecté à tous les enfants de cet état sont inaccessibles en raison parent n'est pas de résoudre. pour toutes les autres routes il n'y aurait rien de vérifier
  • essayé d'utiliser resolve comme l'a suggéré mais j'ai peut-être fait quelque chose de mal, pouvez vous s'il vous plaît prendre un coup d'oeil à mon edit
  • Tiens juste à ajouter quelques mots au sujet de la question de l'application réelle, je suis rediriger l'utilisateur vers la page de connexion, et si je ne les rejeter la promesse, il y a éclatement des requêtes non autorisées de serveur jusqu'à la redirection est effectivement arriver au navigateur. J'ai donc décidé de ne pas rejeter l'erreur avant de les rediriger.
InformationsquelleAutor FabioG | 2015-09-23