2016-02-14 5 views
1

Я пытаюсь создать очень простой механизм проверки подлинности с помощью ui-router. Я делаю проверку в бэкэнде, однако, я хочу перенаправить пользователей, если они не вошли в систему.Проверка подлинности пользователя с угловым ui-маршрутизатором

Однако, когда я пытаюсь посетить/профиль, ничего не происходит. Если я console.log() текст вроде «да», он будет выходить из системы неограниченное количество времени, пока я не получу размер стека, превышающий ошибку. Он продолжает указывать URL-адрес/authcheck, я вижу это через сетевые инструменты Chrome.

Если удалить $state.go(toState.name), я вижу пустую страницу и console.log() показывает, что пользователь подписан в (который я), но тогда я не могу видеть /profile страницу, как и ожидалось.

В чем проблема?

/authcheck200 или 403.

мой завод

angular.module('site.profile').factory('Profile', ["$http", function($http) { 
    return { 
    authCheck: function() { 
     return $http.get('/authcheck'); 
    } 
    }; 
}]); 

UI-маршрутизатор

angular.module('site.profile.routes') 
.run(
    ['$rootScope', 'Profile', '$state', '$stateParams', 
    function($rootScope, Profile, $state, $stateParams) { 
     $rootScope.$state = $state; 
     $rootScope.$stateParams = $stateParams; 
     $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { 
     if (toState.name !== 'auth') { 
      event.preventDefault(); 
      Profile.authCheck().then(function(returned) { 
      if (returned.status === 200) { 
       console.log("yes!"); 
       console.log(toState.name); 
       //$state.go($state); 
      } else { 
       $state.go('auth'); 
      } 
      }); 
     } 
     }); 
    } 
    ] 
) 


.config(
    ['$stateProvider', '$urlRouterProvider', '$locationProvider', 
    function($stateProvider, $urlRouterProvider, $locationProvider) { 

     $locationProvider.html5Mode({ 
     enabled: true, 
     requireBase: false 
     }); 

     $stateProvider 
     .state('profile', { 
      url: '/profile', 
      views: { 
      '': { 
       templateUrl: 'views/profile/profile.html' 
      }, 
      '[email protected]': { 
       templateUrl: 'views/post.html' 
      }, 
      '[email protected]': { 
       templateUrl: 'views/shared/nav/nav.html' 
      }, 
      '[email protected]': { 
       templateUrl: 'views/profile/top.html' 
      } 
      } 
     }) 
     .state('auth', { 
      url: '/signin', 
      template: "please sign in" 
     }); 
    } 
    ]); 

ответ

1

Вы предупреждения по умолчанию для каждого изменения состояния, кроме auth.

Вам нужен способ, чтобы сохранить пользователь, когда они были разрешены, поэтому вам не нужно делать новый запрос каждый раз, а затем вы можете проверить, если этот пользовательский объект существует до предотвращения изменения

Я лично предпочитаю используя resolve в родительском состоянии верхнего уровня, поэтому авторизация должна быть проверена только один раз на родительском. Затем все дочерние состояния будут заблокированы до тех пор, пока этот родитель не будет разрешен.

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