2017-01-25 2 views
0

Я перехожу из ngroute и пытаюсь добавить абстрактное состояние к своим маршрутам, что обеспечивает проверку подлинности. Если пользователь не аутентифицирован, перенаправляйте его на /login, если они аутентифицированы, продолжите.UI-Router абстрактное состояние бесконечный цикл

Одним из ключевых моментов является то, что если пользователь попытается перейти на /login, пока они аутентифицированы, он перенаправит их на /.

Проблема, с которой я сталкиваюсь, заключается в том, что пользователь не аутентифицирован и перенаправлен на /login, и инициируется абстрактное родительское состояние и проверяет, прошли ли они проверку подлинности и перенаправляет их на логин ... и т. Д. В бесконечном цикле.

angular.module('qaApp').factory('authorization', ['$rootScope', '$state', '$stateParams', 'userService', 
    function($rootScope, $state, $stateParams, userService){ 
     return { 
      authorize: function(){ 
       return userService.identity().then(
        function(){ 
         let isAuthenticated = userService.isAuthenticated; 
         if(!isAuthenticated){ 
          $state.is('login'); //Always false 
          $state.includes('login'); //Always false 

          //Somehow check to ensure next route is not /login 
          $state.go('login'); 
         } 
         //Else if next route is /login redirect to /home...etc 
        } 
       ) 
      } 
     } 
    }]); 


angular.module('qaApp').config(function($stateProvider, $urlRouterProvider){ 

    $urlRouterProvider.otherwise('/login'); 

    $stateProvider.state('app', { 
     abstract: true, 
     resolve: { 
      authorize: ['authorization', function(authorization){ 
       return authorization.authorize(); 
      }] 
     } 
    }) 
    .state('login', { 
     parent: 'app', 
     url: '/login', 
     templateUrl: 'app/login/login.html', 
     controller: 'loginController', 
     controllerAs: 'login' 
    }) 
}) 

Как я могу гарантировать, что $state.go('login') происходит только тогда, когда следующий маршрут не /login?

ответ

0

состояние «login» - это дочернее состояние «приложения».
1. запрос на переезд в «/ login», затем
2. маршрутизатор поймать запрос и проверить, разрешено ли оно.
3. Если запрос не разрешен, маршрутизатор перенаправляет запрос на «/ login».
Затем вернитесь к 1.
так, бесконечный запрос на «/ login» произошел.

Итак, не ставьте состояние «входа» в состояние «приложение».
Я думаю, что вы можете разделить такие состояния.
(сделать Войти государство не должны быть разрешены.)
.app
..login
..abstractStateToAuthorize
... anotherStatesAfterAuthorization

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