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的访问控制,就省掉了后台固有的安全实现.

达者广交,分享为先!

时间: 2024-10-01 09:42:21

AngularJS – 实现基于角色访问控制的 GUI的相关文章

AngularJs实现基于角色的前端访问控制

Github 项目地址 https://github.com/zgljl2012/angular-permission 最近做的项目是使用Angular做一个单页应用,但因为用户有不同的角色(管理员.编辑.普通财务人员等),所以需要进行不同角色的访问控制. 因为后端访问控制的经验比较丰富,所以这里只记录了前端访问控制的实现.请注意,前端最多只能做到显示控制!并不能保证安全,所以后端是一定要做访问控制的! 基于角色的访问控制需要做到两个层面的访问控制: 控制页面路由的跳转,没有权限的用户不能跳转到

AngularJs 实现基于角色的前端访问控制

最近做的项目是使用Angular做一个单页应用,但因为用户有不同的角色(管理员.编辑.普通财务人员等),所以需要进行不同角色的访问控制. 因为后端访问控制的经验比较丰富,所以这里只记录了前端访问控制的实现.请注意, 前端最多只能做到显示控制!并不能保证安全,所以后端是一定要做访问控制的! 基于角色的访问控制需要做到两个层面的访问控制: 控制页面路由的跳转,没有权限的用户不能跳转到指定url 页面元素的显示控制,没有对应权限的用户不能看到该元素 但在此之前,我们还有一项重要的事要做. 存储用户信息

基于角色访问控制的权限系统设计

1. 基于角色的权限设计 这种方案是最常见也是比较简单的方案,不过通常有这种设计已经够了,所以微软就设计出这种方案的通用做法,这种方案对于每一个操作不做控制,只是在程序中根据角色对是否具有操作的权限进行控制:这里我们就不做详述 2. 基于操作的权限设计 这种模式下每一个操作都在数据库中有记录,用户是否拥有该操作的权限也在数据库中有记录,结构如下: 但是如果直接使用上面的设计,会导致数据库中的UserAction这张表数据量非常大,所以我们需要进一步设计提高效率,请看方案3 3. 基于角色和操作的

AngularJs基于角色的前端访问控制的实现_AngularJS

最近做的项目是使用Angular做一个单页应用,但因为用户有不同的角色(管理员.编辑.普通财务人员等),所以需要进行不同角色的访问控制. 因为后端访问控制的经验比较丰富,所以这里只记录了前端访问控制的实现.请注意,前端最多只能做到显示控制!并不能保证安全,所以后端是一定要做访问控制的! 基于角色的访问控制需要做到两个层面的访问控制: 控制页面路由的跳转,没有权限的用户不能跳转到指定url 页面元素的显示控制,没有对应权限的用户不能看到该元素 但在此之前,我们还有一项重要的事要做. 存储用户信息

AIX中基于角色的访问控制,第1部分

简介:在本系列文章中,我们将向您陆续介绍并和您一起讨论基于角色的访问控制(Role Based Access Control)的相关内容.作为 AIX 6 的安全新特性,RBAC 为用户提供了细颗粒度的,更加灵活的 安全管理方法.本文是摘自 IBM 红皮书<AIX V6 Advanced Security Features Introduction and Configuration>. AIX V6 和基于角色的访问控制 (RBAC) AIX V6 引入了增强 RBAC,即向一个或者多个普通

.NET框架中基于角色的安全性(1)

.net框架|安全|安全性 在过去的相当长一段时间内,计算机及信息犯罪的比例正在逐渐升高.美国联邦调查局的计算机安全组织在2001年的研究调查中发现85%企业的企业安全受到侵害.在对这些企业进行调查之后提出的财物损失报告中指出,合计损失为3亿7千7百万美元,比起2000年的2亿6千5百万美金增加了42%.由此可清楚的看出,计算机及信息犯罪的发生次数越来越频繁,其所造成的损失也越来越大,另外,犯罪的手段也越来越丰富,令企业安全人员防不胜防.因此企业必须有所行动来保护有价值的信息资产.自然而然的,安

关于Java角色访问控制(RBAC)

角色访问控制(RBAC)引入了Role的概念,目的是为了隔离User(即动作主体,Subject)与Privilege(权限,表示对Resource的一个操作,即Operation+Resource). Role作为一个用户(User)与权限(Privilege)的代理层,解耦了权限和用户的关系,所有的授权应该给予Role而不是直接给User或Group.Privilege是权限颗粒,由Operation和Resource组成,表示对Resource的一个Operation.例如,对于新闻的删除

goRBAC —— Go 语言基于角色的权限控制框架

goRBAC 为 Go 语言应用提供了轻量级的基于角色的访问控制. 该包适用于: * 实体具有一个或多个角色 * 角色需要分配权限 * 权限需要分配给角色 因此,RBAC 具有以下模型: * 在实体和角色之间具有多对多关系 * 在角色和权限之间具有多对多关系 * 角色可以具有父角色(权限继承) 示例代码: import github.com/mikespook/gorbac rbac := gorbac.New() rbac := gorbac.NewWithFactory(YourOwnFac

ASP.NET基于角色的窗体安全认证机制

asp.net|安全 说明:两个月前我刚学 ASP.NET, 在 codeproject.com 看到题目叫 Role-based Security with Forms Authentication 的文章,觉得很有帮助.当时就想翻译成中文.不过直接翻译实在没意思,这两天我参照 Heath Stewart的这篇文章,并且根据自己的理解,把它按照自己的想法和表达方式写成中文.附带上自己为这篇文章做的一个演示的web应用程序. 如果有理解错误的地方,欢迎来信指出或发表评论. 概要: ASP.NET