2016-03-26 3 views
0

У меня есть страница профиля, которую я показываю всем пользователям по адресу url /profile/foo, но как только он загружается, я делаю некоторые проверки, чтобы определить, является ли пользователь, просматривающий этот профиль, владельцем Это. Если это так, я бы хотел отобразить кнопку редактирования, которая на той же странице отобразит другое представление и изменит маршрут на /profile/foo/edit, однако я хотел бы ограничить что-либо из показа на /profile/foo/edit, если этот пользователь не является владельцем или владелец не просмотрел /profile/foo, поскольку контроллер, загружающий всю информацию профиля, настроен на этот маршрут.Как настроить маршрутизацию и контроллеры для ролей пользователей

Я точно знаю, что контроллер, который обрабатывает редактирование, а также интерфейс редактирования для/profile/foo/edit, должен быть ленивым загруженным в зависимости от того, является ли пользователь владельцем профиля.

Я изначально не запускаю .config для моего модуля, чтобы настроить маршрутизацию, потому что я не знаю, является ли пользователь владельцем, поэтому мне пришлось жестко закодировать ng-контроллер на элемент DOM, который действительно должен быть ng-view но изначально не может, так как я не хочу загружать частичный просмотр.

Итак, вот мой вопрос: как настроить такой тип маршрутизации во время выполнения (контроллеры коммутаторов и представления), а также загрузить контроллер и представление. Только если пользователь является владельцем профиля.

+0

Вы установили маршрутизацию для/profile /: userid или/profile/foo ?? если он: userid, то он является общим, который не следует удалять. если вы хотите настроить маршрутизацию для/foo/foo для пользователя foo и/bar для пользовательской панели, тогда вы должны сначала разрешить вход в систему, а затем перенаправить на угловое приложение для настройки маршрутизации вошедшим в систему пользователем. – sdfacre

ответ

0

Существует много способов сделать это. Мое сильное предложение - использовать ui-router, поскольку это рекомендуемый сторонним плагином для управления маршрутами в Angular проектах.

Тогда вы бы заблокировать маршруты, используя маршрут конфигурации, как это:

$routeProvider 
     .when('/', { 
     templateUrl: 'scripts/home/main.html', 
     controller: 'MainCtrl', 
     access: access.public 
     }) 
     .when('/projects', { 
     templateUrl: 'scripts/project/project.html', 
     controller: 'ProjectCtrl', 
     access: access.user 
     }) 
     .when('/projects/:id', { 
     templateUrl: 'scripts/project/project-detail.html', 
     controller: 'ProjectDetailCtrl', 
     access: access.user 
     }) 
     .otherwise({ 
     redirectTo: '/' 
     }); 
    }]); 

Тогда на изменение маршрута вы бы проверить маршрут:

angular.module('app').run(['$rootScope','$location','security', function($rootScope, $location, security) { 
    // Get the current user when the application starts 
    // (in case they are still logged in from a previous session) 
    security.requestCurrentUser(); 

    $rootScope.$on("$routeChangeStart", function (event, next, current) { 
     if (!security.authorize(next.access)) { 
      $location.path('/'); 
     } 
    }); 

}]); 

Использование какой-то службы безопасности:

authorize: function(accessLevelReq) { 
      if (_.isNull(service.currentUserAccessLevels)) { 
       populateUserAccessLevels('public'); 
      } 

      var authenticated = false; 
      _.each(accessLevelReq, function(value){ 
       if(service.currentUserAccessLevels[value]) { 
        authenticated = true; 
       } 
      }); 
      return authenticated; 
     } 

К счастью, у меня есть проект семян, который иллюстрирует этот точный прецедент. https://github.com/thinkjones/meanp-seed

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