开发者社区> 青衫无名> 正文

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

简介:
+关注继续查看

这些天我们忙于应用的前端工作,我们主要使用angular完成的。最近的一个需求是基于角色访问GUI。一个用户可以有多个角色,而它应只能访问授权给他的那一部分GUI。
我们主要通过在2个层次限制应用的GUI访问,来解决上述需求:
1.一个用户只能访问授权给他的页面(或者说流量)

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

要解决上述需求1,我们捕捉路有变化事件并对每一路由变化进行检查,看用户是否授权访问下一路由,保证他不会看到拒绝访问的页面

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

上面的authService 是我们创建的一个服务,它有角色用户列表,并给授权用户路由流量。函数isUrlAccessibleForUser() 将检查分配的用户是否可以访问给定流量并返回true或false.

服务将 从后台和路由访问信息中获取一个用户的角色列表,每个角色将保存在服务本身的一个Map集合中。(关于用户和角色的一些细节可以存到数据局,通过后台的方式获取)

app.factory('authService', function ($http) {

    var userRole = []; // obtained from backend
    var userRoleRouteMap = {
        'ROLE_ADMIN': [ '/dashboard', '/about-us', '/authError' ],
        'ROLE_USER': [ '/usersettings', '/usersettings/personal', '/authError']
    };

    return {

        userHasRole: function (role) {
            for (var j = 0; j < userRole.length; j++) {
                if (role == userRole[j]) {
                    return true;
                }
            }
            return false;
        },

        isUrlAccessibleForUser: function (route) {
            for (var i = 0; i < userRole.length; i++) {
                var role = userRole[i];
                var validUrlsForRole = userRoleRouteMap[role];
                if (validUrlsForRole) {
                    for (var j = 0; j < validUrlsForRole.length; j++) {
                        if (validUrlsForRole[j] == route)
                            return true;
                    }
                }
            }
            return false;
        }
    };
});

这将解决上述需求的第一点,对于需求的第二点我们来创建一条指令。这个指令信息类似以下:

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

如果用户有 ROLE_ADMIN 的这个角色的时候,将以上的html标签将被加载到html的页面中,否则将 这个 Html标签从 页面中移除。

指令的实现代码如下:

.directive('myAccess', ['authService', 'removeElement', function (authService, removeElement) {
    return{
        restrict: 'A',
        link: function (scope, element, attributes) {

            var hasAccess = false;
            var allowedAccess = attributes.myAccess.split(" ");
            for (i = 0; i < allowedAccess.length; i++) {
                if (authService.userHasRole(allowedAccess[i])) {
                    hasAccess = true;
                    break;
                }
            }

            if (!hasAccess) {
                angular.forEach(element.children(), function (child) {
                    removeElement(child);
                });
                removeElement(element);
            }

        }
    }
}]).constant('removeElement', function(element){
    element && element.remove && element.remove();
});

这一办法是很简洁的,而我们在GUI上很巧妙的实现了用户授权. 一个潜在的问题是,如果UI的渲染器在你从后台获取用户角色之前就已经在运行了,那么该HTML中所有带上该指令的部分都会从html中被移除掉. 这对于我们而言不是个麻烦,因为我们会在登录完成之时就获取到了用户角色的详细信息。而如果这一问题对你而言是个问题的话,解决方案可以是这样:如果用户角色还没有获取到,就只是隐藏这些html元素,仅等到你获取到角色列表之后再按照授权0信息将它们移除掉. 同时还请注意不能因为有了一个GUI的访问控制,就省掉了后台固有的安全实现.

达者广交,分享为先!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
CentOS7下如何利用Firewalld防火墙实现IP+Port细粒度访问控制
CentOS7下如何利用Firewalld防火墙实现IP+Port细粒度访问控制
72 0
CentOS Stream 9通过配置sshd_config中AllowUsers实现SSH访问控制
CentOS Stream 9通过配置sshd_config中AllowUsers实现SSH访问控制
326 0
SUSE12 SP5系统使用TCP Wrappers实现限制SSH访问控制
SUSE12 SP5系统使用TCP Wrappers实现限制SSH访问控制
65 0
IIS安全:配置web服务器权限更好地实现访问控制
IIS安全:配置web服务器权限更好地实现访问控制
123 0
SAP S/4HANA CDS View的访问控制实现:DCL介绍
SAP S/4HANA CDS View的访问控制实现:DCL介绍
125 0
详细解析工作流Activiti框架中的LDAP组件!实现对工作流目录信息的访问控制和维护
本片文章介绍了工作流Activiti框架在企业中应用的场景,也就是集成LDAP使用,通过将Activiti框架连接企业的LDAP实现对企业用户和群组信息的管理。文章从用法,用例,配置,属性几个方面分别详细说明了Acitivi集成LDAP使用的具体方式。
125 0
我的mqtt协议和emqttd开源项目个人理解(14) - 使用redis插件来实现访问控制
我的mqtt协议和emqttd开源项目个人理解(14) - 使用redis插件来实现访问控制
221 0
基于角色访问控制RBAC权限模型的动态资源访问权限管理实现
前面主要介绍了元数据管理和业务数据的处理,通常一个系统都会有多个用户,不同用户具有不同的权限,本文主要介绍基于RBAC动态权限管理在crudapi中的实现。RBAC权限模型(Role-Based Access Control)即:基于角色的权限控制。模型中有几个关键的术语: 用户:系统接口及访问的操作者 权限:能够访问某接口或者做某操作的授权资格 角色:具有一类相同操作权限的用户的总称 。 #### 用户角色权限关系 一个用户有一个或多个角色 一个角色包含多个用户 一个角色有多种权限 一个权限属于多个角色
393 0
SAP S/4HANA CDS View的访问控制实现:DCL介绍
来自我的同事Xu Miles Authorization Objects are business concept, they are distinguished by business scenario.
829 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载