AngularJS – 實現基於角色存取控制的 GUI

來源:互聯網
上載者:User

AngularJS – 實現基於角色存取控制的 GUI

這些天我們忙於應用的前端工作,我們主要使用angular完成的。最近的一個需求是基於角色訪問GUI。一個使用者可以有多個角色,而它應只能訪問授權給他的那一部分GUI。

我們主要通過在2個層次限制應用的GUI訪問,來解決上述需求:
 

要解決上述需求1,我們捕捉路有變化事件並對每一路由變化進行檢查,看使用者是否授權訪問下一路由,保證他不會看到拒絕訪問的頁面

 
  1. $rootScope.$on("$routeChangeStart", function(event, next, current) {  
  2.     if(!authService.isUrlAccessibleForUser(next.originalPath))  
  3.     $location.path('/authError');  
  4. }); 

上面的authService 是我們建立的一個服務,它有角色使用者列表,並給授權使用者路由流量。函數isUrlAccessibleForUser() 將檢查指派的使用者是否可以訪問給定流量並返回true或false.

服務將 從後台和路由訪問資訊中擷取一個使用者的角色列表,每個角色將儲存在服務本身的一個Map集合中。關於使用者和角色的一些細節可以存到資料局,通過背景方式擷取)

 
  1. app.factory('authService', function ($http) {  
  2.    
  3.     var userRole = []; // obtained from backend  
  4.     var userRoleRouteMap = {  
  5.         'ROLE_ADMIN': [ '/dashboard', '/about-us', '/authError' ],  
  6.         'ROLE_USER': [ '/usersettings', '/usersettings/personal', '/authError']  
  7.     };  
  8.    
  9.     return {  
  10.    
  11.         userHasRole: function (role) {  
  12.             for (var j = 0; j < userRole.length; j++) {  
  13.                 if (role == userRole[j]) {  
  14.                     return true;  
  15.                 }  
  16.             }  
  17.             return false;  
  18.         },  
  19.    
  20.         isUrlAccessibleForUser: function (route) {  
  21.             for (var i = 0; i < userRole.length; i++) {  
  22.                 var role = userRole[i];  
  23.                 var validUrlsForRole = userRoleRouteMap[role];  
  24.                 if (validUrlsForRole) {  
  25.                     for (var j = 0; j < validUrlsForRole.length; j++) {  
  26.                         if (validUrlsForRole[j] == route)  
  27.                             return true;  
  28.                     }  
  29.                 }  
  30.             }  
  31.             return false;  
  32.         }  
  33.     };  
  34. }); 

這將解決上述需求的第一點,對於需求的第二點我們來建立一條指令。這個指令資訊類似以下:

 
  1. <div my-access=”ROLE_ADMIN”>......</div> 

如果使用者有  ROLE_ADMIN 的這個角色的時候,將以上的html標籤將被載入到html的頁面中,否則將 這個 Html標籤從 頁面中移除。

指令的實現代碼如下:

 
  1. .directive('myAccess', ['authService', 'removeElement', function (authService, removeElement) {  
  2.     return{  
  3.         restrict: 'A',  
  4.         link: function (scope, element, attributes) {  
  5.    
  6.             var hasAccess = false;  
  7.             var allowedAccess = attributes.myAccess.split(" ");  
  8.             for (i = 0; i < allowedAccess.length; i++) {  
  9.                 if (authService.userHasRole(allowedAccess[i])) {  
  10.                     hasAccess = true;  
  11.                     break;  
  12.                 }  
  13.             }  
  14.    
  15.             if (!hasAccess) {  
  16.                 angular.forEach(element.children(), function (child) {  
  17.                     removeElement(child);  
  18.                 });  
  19.                 removeElement(element);  
  20.             }  
  21.    
  22.         }  
  23.     }  
  24. }]).constant('removeElement', function(element){  
  25.     element && element.remove && element.remove();  
  26. }); 

這一辦法是很簡潔的,而我們在GUI上很巧妙的實現了使用者授權. 一個潛在的問題是,如果UI的渲染器在你從後台擷取使用者角色之前就已經在運行了,那麼該HTML中所有帶上該指令的部分都會從html中被移除掉. 這對於我們而言不是個麻煩,因為我們會在登入完成之時就擷取到了使用者角色的詳細資料。而如果這一問題對你而言是個問題的話,解決方案可以是這樣:如果使用者角色還沒有擷取到,就只是隱藏這些html元素,僅等到你擷取到角色列表之後再按照授權0資訊將它們移除掉. 同時還請注意不能因為有了一個GUI的存取控制,就省掉了後台固有的安全實現.

達者廣交,分享為先!

英文:AngularJS – Role based access on GUI

譯文:http://www.oschina.net/translate/angularjs-role-based-access-on-gui

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.