2013-12-11 6 views
5

Я пытаюсь четко реализовать способ перенаправления пользователя на логин входа, если они не вошли в систему. Я основываю свое решение на другом ответе SO here, который doesn Не работайте из коробки. Вот мое решение.Перенаправление на маршрут, если пользователь не прошел аутентификацию

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', 
     }); 
}]); 

Мой вопрос, где я могу слушать на $routeChangeError события, так что я могу перенаправить маршрут? Я пытался сделать это в директиве, но никогда не смог запустить событие. Я не могу поместить его в контроллер, потому что он не будет загружаться, если обещание будет отклонено. Есть предположения?

+0

Вы должны быть в состоянии наблюдать за ним в любом контроллере (или директиве), который находится вне элемента 'ng-view'. – Stewie

+1

может даже помещать его в 'run()' ... небольшую ошибку в вашем коде ... нужно вызвать '$ q.defer();' перед вашим 'if' – charlietfl

ответ

0

Вы можете найти помощь в этом вопросе: AngularJS: Understanding $rootScope.$on('$routeChangeSuccess

Вообще-то я чувствую, что с помощью «решительность» для обеспечения аутентификации является немного странным, но не намного лучше пути, я хотел бы предложить добавить некоторые услуги и т.д. Это, кроме того, точка.

И, наконец, другие решения для маршрутизации, такие как https://github.com/dotJEM/angular-routing, могут предоставить вам лучшую степень контроля.

3

Есть ли причина, по которой вы не должны перенаправлять пользователя изнутри функции? Это отлично работает для меня, оно не загружает контроллер/просмотр, если обещание не разрешено.

я изменил функцию так:

var requireAuthentication = function() { 
    return { 
     load: function ($q, $location) { 
      console.log('Can user access route?'); 
      var deferred = $q.defer(); 
      deferred.resolve(); 
      if (g_isloggedIn === true) { // fire $routeChangeSuccess 
       console.log('Yes they can!'); 
       return deferred.promise; 
      } else { // fire $routeChangeError 
       console.log('No they cant!'); 
       $location.path('/login'); 

       // I don't think this is still necessary: 
       return $q.reject("'/login'"); 
      } 
     } 
    }; 
}; 
+0

Где написать этот код? –

+0

в блоке .config() может быть? Как в вопросе. Или где-то в области? Просто так оно доступно. – wiherek

0

я уверен, что вы хорошо мимо этого вопроса, но и для тех, кто ищет ответы сейчас, вот мои два цента.

Единственное, что вам не хватает здесь, это то, что происходит, когда обещание отвергается. Вы захотите сделать это с помощью HTTP-перехвата. Вы ставите слушателя на routeChangeError и перенаправляете туда. https://docs.angularjs.org/api/ng/service/$http (прокрутите вниз до раздела перехватчиков)

Смежные вопросы