AngularJS – 实现基于角色访问控制的 GUI

开发 前端
这些天我们忙于应用的前端工作,我们主要使用angular完成的。最近的一个需求是基于角色访问GUI。一个用户可以有多个角色,而它应只能访问授权给他的那一部分GUI……

这些天我们忙于应用的前端工作,我们主要使用angular完成的。最近的一个需求是基于角色访问GUI。一个用户可以有多个角色,而它应只能访问授权给他的那一部分GUI。

我们主要通过在2个层次限制应用的GUI访问,来解决上述需求:
 

  1. 一个用户只能访问授权给他的页面(或者说流量)

  2. 在一个页面上,用户只能看到授权给他的那部分。

要解决上述需求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

责任编辑:林师授 来源: 开源中国社区 编译
相关推荐

2015-08-28 09:31:00

2019-11-22 09:40:40

SpringJava编程语言

2013-08-22 09:55:14

2013-08-20 10:19:38

2009-07-29 17:34:00

ibmdwWebSphereMQ

2009-02-01 10:54:00

MAC地址访问控制

2014-06-10 16:51:44

云数据应用访问安全控制

2010-09-01 16:43:26

Squid ACLSquid访问列表Squid

2022-12-30 09:54:55

智能建筑云计算

2010-08-18 13:13:01

静态路由

2009-07-29 17:31:00

2010-05-25 11:35:02

JavaKilim

2018-02-25 07:10:32

访问控制数据安全数据泄露

2013-03-08 10:09:30

Hadoop

2009-12-23 16:32:04

静态路由配置

2021-03-16 07:56:32

KubernetesWebhook权限

2012-09-18 09:50:41

2023-11-14 07:09:38

2011-08-03 10:01:28

网络智能手机

2011-08-03 10:20:27

网络智能手机
点赞
收藏

51CTO技术栈公众号