2016-07-22 42 views
0

我使用angular-permission並且我想檢查用戶是否有權訪問特定狀態。檢查用戶是否有權訪問特定狀態

我的狀態配置:

$stateProvider 
     .state('app', { 
      url: '/', 
      abstract: true, 
      data: { 
       permissions: { 
        only: ['BASE'] 
       } 
      } 
     }) 

有沒有一種方法或一些東西,我可以在控制器使用來確定呢?

// somewhere in controller 
if (Permission.hasAccessToState('app')) { 
    // I want to check if user has access to state without navigating to it 
}; 

如果有人有興趣,這裏是一個對應的discussion on github

+0

檢查我的答案是否有幫助 –

回答

1

我在文檔wiki中找不到東西。但根據來源和評論,似乎有一個Authorization服務可用,你可以利用。

//inject PermissionMap and Authorization  
App.controller('Controller',function(PermissionMap,Authorization,$scope) { 

    //get the state by name an assign it to `state` 
     var permissionMap = new PermissionMap(state.data.permissions); 

     var authorizationResult = Authorization.authorize(permissionMap); 

     authorizationResult 
     .then(function() { 
      //authorized 
     }) 
     .catch(function (rejectedPermission) { 
      //unauthorized 
     }); 
}); 

看看這個代碼,看看它是否工作

UPDATE

UR的答覆後,我看着更深入的代碼。 也許我們需要StatePermissionMap和StateAuthorization。

var statePermissionMap = new StatePermissionMap(state); 

    StateAuthorization 
     .authorize(statePermissionMap) 
     .then(function() { 
     //authorized 
     }) 
     .catch(function (rejectedPermission) { 
     //unauthorized 
     }) 
+0

'新PermissionMap(state.data.permissions);'似乎沒有考慮到的權限的父母國家。值得懷疑的是,它會起作用。儘管如此,我更接近正確的答案。不管怎麼說,還是要謝謝你! –

+0

查看我的更新的; D。找到它在https://github.com/Narzerus/angular-permission/blob/master/src/permission-ui/permission-ui.js – MMhunter

0

在文檔中沒有提到這樣的事情,但這裏是我如何實現它。

基本上,我在我的$ rootScope用戶角色(因爲我從後端獲取他們)

1)定義的所有狀態定義,什麼所有用戶都可以訪問該州。例如:

 .state('state1', { 
      url: '/state1', 
      views: { 
       content: { 
        templateUrl: 'state1-partial.html', 
        controller: 'StateOneController' 
       } 
      }, 
      data: { 
        access:['Admin','Manager'] //only admin and manager can access this state 
      } 
     }) 
     .state('state2', { 
      url: '/state2', 
      views: { 
       content: { 
        templateUrl: 'state2-partial.html', 
        controller: 'StateTwoController' 
       } 
      }, 
      data: { 
        access:['Admin'] //only admin can access this state 
      } 
     }) 

2)然後在angular.module運行函數I訪問這些當狀態改變事件發生時:

此外,我使用服務isAuthorized這裏,如果用戶被授權訪問的驗證那個狀態。如果是,我將用戶導航到該狀態,否則我會拋出一個錯誤。

angular.module('myApp').run(function($rootScope, $state,$stateParams,isAuthorized){ 
    $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState,fromParams) { 

    var isAccessRequired = toState.data.access; 
    var isAccessRequired = toState.data && toState.data.access; 
     //prevent default routing 


      if(isAccessRequired){ 
       //I stored userRoles in $rootScope.userRole in an array when fetching from backend. 
       var hasAccess = isAuthorized($rootScope.userRole,toState.data.access); 

       if(!hasAccess){ 
        event.preventDefault(); 

        //user doesnt have access, show error and dont take him anywhere 


       } 

      } 


    }); 
}); 

3)在我的服務(isAuthorized):

(function(){ 
    'use strict'; 

    angular.module('myApp') 

     .service('isAuthorized', function() { 
      return function(role,access){ 

      //logic here that will see if data.access is present in the user roles, if yes it will return true else return false 

       return flag; 
      } 


     }); 

})(); 
+0

感謝您的答覆,但我需要使它的角度許可 –

相關問題