2013-10-28 4 views
4

Я хотел бы зарегистрировать маршруты в моих угловых приложениях на основе ролей пользователя, я могу сделать что-то вроде:

angular.module('myModule', []) 
    .config(function($routeProvider, $http){ 
     $routeProvider.when('/home',{ 
      templateUrl: '/home.html', 
      controller: 'HomeCtrl' 
     }); 
     $http.get('/user') 
      .success(function(user){ 
       if (user.admin){ 
        $routeProvider.when('/dashboard, { 
         templateUrl: '/dashboard.html', 
         controller: 'DashboardCtrl' 
        }); 
       } 
      }); 
    }); 

Но в методе config я не могу используйте услугу $http, как я могу ее достичь?

ответ

4

Отъезд ui-router. Это гораздо более функциональная система маршрутизации на основе состояния для Angular. Он решает вашу проблему, позволяя вам делать запрос модели в момент изменения состояния и возвращать обещание, чтобы при получении вашей модели вы могли либо продолжить, либо изменить состояние снова.

0

У меня такая же проблема. Существует мое решение:

'use strict'; 

angular.module('theAppName') 
    .config(function ($routeProvider) { 
     $routeProvider 
      .when('/check', { // the role has to be 'not_confirmed' 
      templateUrl: 'app/account/check/check.html', 
      controller: 'CheckCtrl' 
      }); 
    }) 

.run(function ($rootScope, $location, Auth) { 
    // Redirect to '/' if the role is not 'not_confirmed' 
    $rootScope.$on('$routeChangeStart', function (event, next) { 
     Auth.getUserRoleInAsync(function(role) { 
     if (next.$$route.originalPath === '/check' && role !== 'not_confirmed') { 
      $location.path('/'); 
     } 
     }); 
    }); 
    }); 

Если вы не точный протестировали маршрут, это будет испытанием для всех маршрутов. Поэтому вам нужно использовать next.$$route.originalPath.

В файле служба Auth:

getUserRoleInAsync: function(cb) { 
    if(currentUser.hasOwnProperty('$promise')) { 
     currentUser.$promise.then(function(data) { 
     cb(data.role); 
     }).catch(function() { 
     cb(false); 
     }); 
    } else { 
     cb(false); 
    } 
    }, 

Я жду обратной связи по этому поводу.

+0

В итоге я нашел более легким и практичным использование концепций HATEOAS (и гипермедиа) в своем приложении. Таким образом, сервер говорит, что пользователь может сделать, таким образом, вся логика авторизации находится на сервере и не дублируется на клиенте. – rascio

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