2016-03-07 87 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

其實,我把我的評論回來了。在使用此方法調用解析之前,控制器仍會實例化。 –