2015-05-12 5 views
3

У меня возникла проблема с моим механизмом аутентификации. Я должен вызвать API для получения текущих ролей пользователей, а затем проверить его, чтобы решить, что пользователь может просматривать страницы моего приложения. Моя идея: вызов API в myApp.run блоке, а затем проверить:AngularJS: проверить роль пользователя, чтобы решить, есть ли у пользователя разрешение на просмотр страниц или нет.

angular.module('MyApp') 
.run(['$rootScope', 'authenService', '$location', function($rootScope, authenService, $location) { 
    var currentUser; 

    function checkRole() { 
     if(angular.isDefined(currentUser) && angular.isObject(currentUser) && ... && currentUser.isAdmin && $location.url() === '/dashboard') { 
     return true; 
     } 
     return false; 
    } 
    /* 
    ** @name: getCurrentUser 
    ** @description: get current user info, use promise $q 
    */ 
    authenService.getCurrentUser() 
    .then(function getSuccess(currentUserInfo){ 
     currentUser = currentUserInfo; 
     //if user is not admin and current page is not dashboard page, redirect to dashboard page 
     if(!checkRole()) { 
     $location.path('/dashboard'); 
     } 
     }, function getError(){}); 

    //when user go to new path, check role if user have permission to access new page or not 
    $rootScope.$on('$routeChangeStart', function onRouteChange() { 
     if(!checkRole()) { 
     $location.path('/dashboard'); 
     } 
    }) 
}]; 

Моя проблема: в то время как getCurrentUser API находится в стадии разработки (до сих пор не получил ответа от сервера), код $ rootScope $ на (». $ routeChangeStart ') выполняется и всегда перенаправляет пользователя на страницу панели мониторинга. Что мне делать? У вас есть идеи/решения для решения этой проблемы? или Как ждать ответа от сервера, а затем запустить контроллер UserCtrl (когда пользователь переходит к/пользователю, UserCtrl будет выполняться без checkRole, потому что ответ не получен).

EDIT

То, что я действительно хочу сделать это, когда пользователь переходит на mySite.com, я буду называть API, чтобы получить роли пользователей. Запрос все еще продолжается, но каким-то образом пользователь переходит к mySite.com/#/user, страница пользователя отображается в Интернете сразу (Требование: пользователь не может видеть страницу пользователя до завершения запроса). По завершении запроса пользователь будет перенаправлен на mySite.com/#/dashboard, если у пользователя нет разрешения.

РЕШЕНИЕ

Я показать экран загрузки, чтобы блокировать мое приложение, пока запрос закончен. Спасибо за помощь.

+1

использование $ д: https://docs.angularjs.org/api/ng/service/$q – MoLow

+0

возможно дубликат [Как дождаться ответа приходит из запроса $ http, в angularjs?] (http://stackoverflow.com/questions/18421830/how-to-wait-till-the-response-comes-from-the-http-request-in-angularjs) –

+0

@MoLow: Как я могу использовать $ q для своей проблемы? Например: пользовательский тип адреса mysite.com/#/user, угловая переместится на страницу пользователя (user.html), а контроллер UserCtrl будет выполнен. –

ответ

0

попробовать с помощью $ д службы:

angular.module('MyApp') 
.run(['$rootScope', 'authenService', '$location', '$q', function($rootScope, authenService, $location, $q) { 
    var currentUser; 

    function checkRole() { 
     var defered = $q.defer(); 
     if(angular.isDefined(currentUser) && angular.isObject(currentUser)){ 
     defered.resolve(currentUser.isAdmin && ($location.url() === '/dashboard')) 
     }else{ 
      authenService.getCurrentUser().then(function getSuccess(currentUserInfo){ 
       currentUser = currentUserInfo; 
       defered.resolve(currentUser.isAdmin && ($location.url() === '/dashboard')) 
      }); 
     } 
     return defered.promise; 
    } 

    $rootScope.$on('$routeChangeStart', function onRouteChange() { 
     checkRole().then(function(isAdmin){ 
     if(isAdmin) $location.path('/dashboard'); 
     }) 
    }) 
}]; 
+0

Спасибо за помощь. Возможно, мой вопрос непонятен. См. Мой пересмотренный вопрос. :) –

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