2016-03-07 70 views
1

我想在我的应用程序中使用角度UI路由器的resolve函数来实现一些安全性。我在这个问题的第二个答案中构建了基于解决方案#2的解决方案:Angular ui-router: how to prevent access to a stateAngular UI路由器和安全

它工作正常,除了我不想允许用户导航到的路由控制器仍然实例化。我或多或少地遵循John Papa对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> 

现在,你可以从国家配置中删除controllercontrollerAs

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

这样,如果您的身份验证不成功,orderqueue将不会加载,因此,您的views/orderqueue.html将不会被加载,因此控制器将不会实例化(因为控制器是以HTML视图启动的)。

+1

我想这很简单,但并不真正需要。我实际上正朝着我的所有路线,控制器,模板等的数据驱动解决方案发展,并且不太喜欢在我的视图中嵌入控制器引用。 1.5中的新路由器功能是否相同?似乎在这个时候朝这个方向迈进是一个好的举动,因为这也有助于为Angular 2.0迁移做准备。 –

+0

尽管如此,您的建议确实按预期工作。 –

+0

其实,我把我的评论回来了。在使用此方法调用解析之前,控制器仍会实例化。 –