2015-04-28 4 views
0

У меня есть приложение, в котором каждая страница, кроме входа, требует аутентификации. Я делаю это, проверяя $ stateChangeStart и затем перенаправляя/login, когда токен не установлен. при начальной загрузке приложения это работает нормально, но на экране входа в систему, если я набираю еще один «ограниченный» URL-адрес. Он выполняет проверку, изменяет URL-адрес, но все еще загружает ограниченную страницу. Что мне здесь не хватает?Проблема с перенаправлением аутентификации Angularjs

//app.run:

app.lazy = $couchPotato; 
    $rootScope.$state = $state; 
    $rootScope.$stateParams = $stateParams; 
    $rootScope.$on('$stateChangeStart', function(event, toState, toStateParams) { 
     console.log("state changed to "+toState.name); 
     console.log(toState); 
     Authentication.validateLogin(toState, toStateParams); 
    }); 

Authentication.validateLogin:

validateLogin:function(toState, toStateParams){ 
     $rootScope.toState = toState; 
     $rootScope.toStateParams = toStateParams; 
     if ($localStorage.token == null) { 
      console.error("Not Authenticated!"); 
      $location.url('/login'); 
     } 
} 
+0

Вы можете попытаться перенаправить с помощью '$ window.location.href'? –

+0

Ничего не изменил –

ответ

1

Я вижу, что вы используете угловой-UI, так что я не совсем уверен, что преимущества, которые имеют по сравнению с использованием «базовый» угловой, но я написал это для обработки проверки маркера при изменении маршрута.

app.run(['$rootScope', 'authService', 
    function ($rootScope, authService) { 
     $rootScope.$on("$routeChangeSuccess", function (event, next, current) { 
      if (next && next.$$route && authService.isAuthenticated()) { 
       authService.validate(); 
       $rootScope.appTitle = next.$$route.title; 
      } 
     }); 
    }]); 

в $ routeChangeSuccess обрабатывает навигацию по маршрутам после загрузила контроллер (очень важно для объектов, которые загружаются при загрузке страницы, когда проверка подтверждается), а затем проверяет их.

Это также выполняет 2 проверки в том, что он проверяет, существует ли токен в локальном хранилище и сформирован правильно, и если он есть, отправьте его обратно на сервер, чтобы подтвердить это.

Я также обнаружил, что мне пришлось использовать $ locationChangeStart для обработки обновления страницы, чтобы повторно проверить, когда кто-то пытается обновить страницу.

validateLogin решение:

validateLogin:function(toState, toStateParams){ 
    if(toState.access){ 
     if(toState.access.loginRequired){ 
       if ($localStorage.token == null) { 
        $state.go('login'); 
       } 
     } 
    } 
+0

Ничего себе, это здорово знать. К сожалению, это не похоже на мою проблему. –

+0

Как выглядит ваш маршрут? У вас есть какие-либо дополнительные свойства, установленные на ваших маршрутах, которые будут конфликтовать с чем-то? – jcc

+0

Да, у меня: urlRouterProvider.otherwise ('/ login'); –

0

Попробуйте это с validateLogin:

validateLogin:function(toState, toStateParams){ 
     if(toState.access){ 
      if(toState.access.loginRequired){ 
        if ($localStorage.token == null) { 
         $state.go('login'); 
        } 
      } 
     } 
} 
Смежные вопросы