首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

ITeye论坛关于权限控制的议论

2012-09-21 
ITeye论坛关于权限控制的讨论在许多的实际应用中,不只是要求用户简单地进行注册登录,还要求不同类别的用户

ITeye论坛关于权限控制的讨论


在许多的实际应用中,不只是要求用户简单地进行注册登录,还要求不同类别的用户对资源有不同的操作权限。目前,权限管理系统也是重复开发率最高的模块之一。

ITeye论坛中关于权限控制的帖子非常之精彩,现将其精华内容摘录于下。 目 录 [ - ]
    楼主关于权限控制的问题 RBAC(基于角色的访问控制)扫盲贴 george_space的“权限控制”的部分数据模型 sdnasky和george_space关于该问题的精彩探讨 其他ITeye会员关于此问题的回复
楼主关于权限控制的问题


角色是什么?可以理解为一定数量的权限的集合,权限的载体。例如:一个论坛系统,“超级管理员”、“版主”都是角色。版主可管理版内的帖子、可管理版内的用户等,这些是权限。要给某个用户授予这些权限,不需要直接将权限授予用户,可将“版主”这个角色赋予该用户。
当用户的数量非常大时,要给系统每个用户逐一授权(授角色),是件非常烦琐的事情。这时,就需要给用户分组,每个用户组内有多个用户。除了可给用户授权外,还可以给用户组授权。这样一来,用户拥有的所有权限,就是用户个人拥有的权限与该用户所在用户组拥有的权限之和。(下图为用户组、用户与角色三者的关联关系)ITeye论坛关于权限控制的议论在应用系统中,权限表现成什么?对功能模块的操作,对上传文件的删改,菜单的访问,甚至页面上某个按钮、某个图片的可见性控制,都可属于权限的范畴。有些权限设计,会把功能操作作为一类,而把文件、菜单、页面元素等作为另一类,这样构成“用户-角色-权限-资源”的授权模型。而在做数据表建模时,可把功能操作和资源统一管理,也就是都直接与权限表进行关联,这样可能更具便捷性和易扩展性。(见下图)

ITeye论坛关于权限控制的议论


请留意权限表中有一列“权限类型”,我们根据它的取值来区分是哪一类权限,如“MENU”表示菜单的访问权限、“OPERATION”表示功能模块的操作权限、“FILE”表示文件的修改权限、“ELEMENT”表示页面元素的可见性控制等。
这样设计的好处有二。其一,不需要区分哪些是权限操作,哪些是资源,(实际上,有时候也不好区分,如菜单,把它理解为资源呢还是功能模块权限呢?)。其二,方便扩展,当系统要对新的东西进行权限控制时,我只需要建立一个新的关联表“权限XX关联表”,并确定这类权限的权限类型字符串。
这里要注意的是,权限表与权限菜单关联表、权限菜单关联表与菜单表都是一对一的关系。(文件、页面权限点、功能操作等同理)。也就是每添加一个菜单,就得同时往这三个表中各插入一条记录。这样,可以不需要权限菜单关联表,让权限表与菜单表直接关联,此时,须在权限表中新增一列用来保存菜单的ID,权限表通过“权限类型”和这个ID来区分是种类型下的哪条记录。
到这里,RBAC权限模型的扩展模型的完整设计图如下:

ITeye论坛关于权限控制的议论

?

?

我目前比较关心的是:

?

1、数据权限(读取数据的深度)有什么更通用的设计?

2、页面元素的控制,除了使用“自定义权限标签”,或者“服务端组装视图层组件”两种方法,还有没有更好的设计?

?

sdnasky和george_space关于该问题的精彩探讨


    问题:现在标签中定义拥有“saveOrder”权限的人,可以看见保存订单的按钮,但是项目交给客户以后,客户想让拥有“kissGirl”权限的人,也能看见保存订单按钮,那么你是不是要去修改页面?

    这样每次权限定义发生变动,都要去修改页面自定义标签,跟硬编码写死权限判断有什么分别?

    ? sdnasky写到:
    ? 数据级:良好设计+AOP可以实现
    问题:怎么实现?这个是关键!

    举个简单的例子:

    一个列表页,要求:普通员工看见自己发表的信息(标题、发布时间);

    部门经理看见本部门的信息(标题、发布时间 + 发布人积分);

    管理员看见所有的信息(标题、发布时间、发布人积分 + 删除/修改)按钮。

    这个列表页是使用web service从美国加利福尼亚州总部读取的,问,如何实现数据权限控制?

    这样的需求,不是一个小小的AOP拦截就能够搞定的,即使能搞定,其复杂度也是超乎想象的。

    有一个比较笨的方法,就是在服务端做权限逻辑判断,组装出当前权限应该看到的数据量和数据列,然后使用json

    格式传递到视图层进行渲染,这样就相当于把视图端自定义标签所做的判断,移动到了服务端。

    服务端使用策略模式,针对不同的权限,执行不同的查询逻辑;

    如果有新的查询逻辑出来,就更麻烦了,理论上可以使用“页面上可视化配置 = > 动态生成java类 => 动态加载新的查询逻辑类 => 动态执行新的查询逻辑类”这样的方式来把新逻辑插入当前的判断中,但是这仅仅是理论上的设计,实际做起来,可不是上面这样三言两语能够“说”完的。

    要做到数据权限的精确控制,除了和系统紧密耦合的做法和硬编码判断的做法,我还没有发现更好的实现,请楼下大牛们赶紧赐教。




      权限标识可以使用命名规则,用来区分不同类型权限:菜单,界面控件,或其他的

      2.取数据的方法如果设计合理,预留了可以方便添加数据过滤的接口,用AOP拦截方法调用,修改输入参数即可

      即使设计不好,用AOP拦截方法调用(不调用现有方法),直接调用全新的含有数据过滤的取数据方法即可,无非是有重复代码而已

      补充一句不是“小小的AOP” AOP是非常强大的,它是代理模式,既然都给我代理,我就可以为所欲为(拦截调用,修改参数,修改返回值,甚至调用全新的方法),都为所欲为了,还不够强大么?




        但是问题的关键是:如果现在客户要求“user.teamleader.*”也能保存订单,你是不是要把“user.teamleader.*”手动添加到权限标签里面去?是不是要改动视图层页面?是不是跟修改硬编码也简单不到哪里去?

        2、AOP方式没有亲身实践过,不知道是否行得通,不做评论。

        下面是我现在的初步设计,总体的意图是将查询逻辑留给软件部署者来在界面中配置:

        ITeye论坛关于权限控制的议论

        执行阶段时序图:

        ITeye论坛关于权限控制的议论


        sunway00 写道多角色的情况一般来说是很普遍的,很难将每一个用户的功能都抽象为角色进行单一的角色赋权。给给用户单独赋予权限是一种变通的解决办法,但是一不小很容易失控造成角色和权限的混乱。

        数据权限如果有两个或更多维度的话应该如何处理呢?

        比如:分地区、类型两种维度

        省日化经理只能看本省范围内日化产品的销售情况,城市经理能看到本市范围全部商品的销售情况等等

        如果不同的角色对于同一个功能有不同的数据范围要求,如何能设计一个良好的通用模型?

        sslaowan 写道数据包括业务对象,菜单,功能这些东西都是ACL,一张表搞定,这就是一个通用模型了。

        然后用户角色就是RBAC,可以为不同用户分组形成UserGroup,可以为不同权限分组形成Role

        不懂的话可以参考Spring Security的实现。

        四书五经 写道楼主可有接触过微软的WSS(现在叫MOSS),它里面的权限管理非常的棒:网站级的、页面级的、菜单级的、内容级的(就是一个简单的word文件都可以赋权限给不同的用户来操作)

        、用户组级的、域级别的...总之很多。

        完全基于数据库实现,有兴趣的话自己找找wss/moss权限管理的文章看看

        a123159521 写道RBAC,经典模型!,可以在此基础上进行扩展,比如权限分为菜单权限,页面元素权限,资源权限,万变不离其宗

        poko123 写道动态权限 是难上加难啊,放在持久层 牵涉的也太多了。

        到现在为止我也没办法解决。不放持久层分页就会有多有少,要是少到一条都没有就麻烦了。有一点的话 还糊弄的过去。

        其他层次的问题 , 我全部通过AOP 拦截。有时候还要修改拦截的数据,反正搞的权限代码也得理解业务,都不完美。

        vb2005xu 写道我觉得完全可以综合成 [资源] - [角色] - [用户]

        只是资源里面的 可以多加一个 type 字段 类型可以是 url ,file 等

        这样会不会简化了呢

        前天一想写这个玩意 ... 郁闷 http://vb2005xu.iteye.com/blog/1136852

        发现角色之间重复、冗余的权限很多

        关于这个 我说说我的解决方案 roles 表里面加个 字段 parent_id 以此来实现 角色间的继承

        yin_bp 写道权限管理可以总结为以下几点:

        1.权限模型选型-基于角色控制的权限模型,组织机构模型等等

        2.权限信息维护-尤其是分级权限管理和维护,这个很重要,要做到不失功能的前提下,尽量做的简单实用、切忌复杂化,还要有强大的权限查询和回收功能

        3.权限控制api-这个一定要通俗易懂,而且要保证性能,可适当引入缓冲机制

        4.权限缓冲同步和刷新-尤其是在集群环境下

        5.做到以上几点的前提下,功能级权限和数据级权限就没有问题了,为了降低权限表的数据量,可以在通用权限维护管理的前提下增加按类别划分存放权限数据表的功能

        至于权限的划分,应该可以划分为以下三大类:

        1.功能权限-系统菜单,页面功能操作点

        2.数据权限-业务数据范围权限

        3.管理权限-管理功能权限和数据权限的权限

        Metadmin 写道数据级应该使用规则引擎来实现;

        推荐一款开源产品——ralasafe权限管理中间件,内部也是使用规则对数据级策略进行描述。ralasafe还提供了图形界面来实现规则的图形化配置,不必手写配置。

        http://www.ralasafe.cn

        owenludong 写道页面标签上的ID 当然需要用权限ID,像你得需求 如果要给另外一个用户使用那么我们就把该权限付给该用户即可,标签实现类里 只要根据权限ID 去查找该权限ID对应的用户,只要有当前用户 就可以显示。

        但是这里还是又一个问题。就是这样做违背了RBAC的模型,我引用了ralasafe权限中间件其中一位commiter的话:“主体和资源种类很多时候,权限控制条目则急剧膨胀条目是N(主体)*N(资源),显然需要有针对性的寻找规律进行分解从而减少数目,可以发现的是如果通过定义有限的角色(R)来替代主体授权则条目数量变化为N*R+R*M,显然角色数量是远远小于主体数量的,从而能够达到简化的母的。这就是RBAC得来源”。因此把上面的用户全部换成角色,基于角色的访问控制将很好的防止了权限的冗余? 后期维护也方便。 所以基于页面级的权限控制 我们建议将控制点设置为权限ID或叫资源ID,george_space提出的基于规则的命名 这个后期维护起来将会省很大的力气,另外实现类 就根据权限ID去role_privilege表里查找所有的角色,遍历该角色 查找上下文中用户是否在这些角色中。 ralasafe严格按照RBAC模型 并基于策略的模型实现数据集权限。 网址:www.ralasafe.cn? 共同关注。

热点排行