2016-03-07 2 views
1

Я пытаюсь реализовать некоторую безопасность в своем приложении, используя функцию углового ui-router resolve. Я разработал решение, основанное на решении № 2 во втором ответе на этот вопрос: Angular ui-router: how to prevent access to a stateУгловой UI Router & Security

Он отлично работает, за исключением того, что контроллер маршрутов, который я не хочу разрешать пользователям, все еще создается. Я более или менее следую рекомендациям Джона Папы для Angular, поэтому у меня есть функция activate в каждом контроллере. Я мог бы дважды проверить аутентификацию здесь, но для этого потребуется повторная работа с каждым из моих контроллеров. Кроме того, исключение использования функции $timeout в функции аутентификации из исходного ответа не оказывает отрицательного воздействия.

Вот как я настройка маршрута, чтобы справиться с этим:

$stateProvider.state('orderqueue', { 
       url: "/orderqueue", 
       templateUrl: "views/orderqueue.html", 
       controller: 'orderQueueController', 
       controllerAs: 'orders', 
       role: 'Order Admin', 
       resolve: {authenticate: authenticate} 
      }); 

и моя функция Аутентифицировать выглядит следующим образом:

function authenticate($q,$state,$timeout, UserService) { 
      (new UserService()).$getUser().then(
       function(user) { 
        var role = ($state.current.role) ? $state.current.role :$state.current.name ; 

        // alert(role) ; 
        if (user.userName == 'wmfeltman') { 
         return $q.when()  
        } else 
        { 
         // $timeout(function() { 
         // This code runs after the authentication promise has been rejected. 
         // Go to the log-in page 
          $state.go('login') 
         // }) 
         // Reject the authentication promise to prevent the state from loading 
         return $q.reject() 
        } 
       } 
      ) 
     } 

Есть ли способ, чтобы разрешить стрелять до контроллер создается? Документы, похоже, указывают, что так оно и должно работать, но это не так.

ответ

1

Это довольно просто. Я вижу, что большинство людей определяет controller в самой конфигурации состояния.

Но вы должны определить контроллер в самой точки зрения, используя ng-controller так:

views/orderqueue.html

<div ng-controller="orderQueueController as orders"> 
    <!-- your stuff --> 
</div> 

Теперь вы можете удалить controller и controllerAs из состояния конфигурации:

$stateProvider.state('`', { 
      url: "/orderqueue", 
      templateUrl: "views/orderqueue.html", 
      role: 'Order Admin', 
      resolve: {authenticate: authenticate} 
     }); 

Таким образом, если ваша аутентификация не удалась, orderqueue не загружается, следовательно, ваш views/orderqueue.html не будет загружен, поэтому контроллер не будет создавать экземпляр (поскольку контроллер запускается с HTML-представлением).

+1

Я думаю, это достаточно просто, но не очень желательно. Я действительно продвигаюсь к решению, основанному на данных, для всех моих маршрутов, контроллеров, шаблонов и т. Д., И мне не очень нравится встраивать ссылки контроллера в мои представления. Является ли новый маршрутизатор в 1,5 функции одинаковым? Похоже, что в этот момент может быть хорошим шагом в этом направлении, так как это также поможет в подготовке к миграции с угловым 2.0. –

+0

Для записи, однако, ваше предложение работает так, как ожидалось. –

+0

На самом деле, я возвращаю свой комментарий. Контроллер по-прежнему создается экземпляр до того, как решение вызывается с использованием этой методологии. –

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