- 浏览: 129072 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
skill_job:
请问如何保证instance实例的线程安全?
浅谈java单例模式延迟加载 -
FLFLFLFLFLS:
很实用的,
java代码下载了,在eclipse中运行了一下 ...
针对如"123456"之类的任意字符序列,输出它们所有的排列组合 . -
FLFLFLFLFLS:
很实用的,
java代码下载了,在eclipse中运行了一下, ...
针对如"123456"之类的任意字符序列,输出它们所有的排列组合 . -
dengminghua1016:
不同古文的深远,现代的网络词语充满活力,其词意的直接和幽默将现 ...
网络经典语句 -
dengminghua1016:
古文的意境可意不可言,给人的想象空间可谓浩瀚无边···收集一些 ...
古文中惊艳的句子,绝对有你想要的!
在许多的实际应用中,不只是要求用户简单地进行注册登录,还要求不同类别的用户对资源有不同的操作权限。目前,权限管理系统也是重复开发率最高的模块之一。
权限控制应该是分为3类:
1. 菜单级别
2. 页面元素级别
3. 数据级别
目前好像用的比较多的是基于RBAC的,我经常用的也就是控制到菜单级别,对于控制页面元素和数据级别用的不是很多,目前需要解决权限控制到页面元素级别,网上看了很多但是不是很明白。不知大家有什么好的解决方案没有。大家的表都是怎样设计的?希望高手们不吝指点,有什么好的方案让借鉴借鉴。
我的目前表主要就包括5张:
用户表;角色表;菜单表(包括一级菜单、二级菜单) ;用户和角色的关联表(用户角色多对多);角色和菜单的关联表等。
RBAC(基于角色的访问控制)扫盲贴 Top
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。(如下图)
角色是什么?可以理解为一定数量的权限的集合,权限的载体。例如:一个论坛系统,“超级管理员”、“版主”都是角色。版主可管理版内的帖子、可管理版内的用户等,这些是权限。要给某个用户授予这些权限,不需要直接将权限授予用户,可将“版主”这个角色赋予该用户。
当用户的数量非常大时,要给系统每个用户逐一授权(授角色),是件非常烦琐的事情。这时,就需要给用户分组,每个用户组内有多个用户。除了可给用户授权外,还可以给用户组授权。这样一来,用户拥有的所有权限,就是用户个人拥有的权限与该用户所在用户组拥有的权限之和。(下图为用户组、用户与角色三者的关联关系)
在应用系统中,权限表现成什么?对功能模块的操作,对上传文件的删改,菜单的访问,甚至页面上某个按钮、某个图片的可见性控制,都可属于权限的范畴。有些权限设计,会把功能操作作为一类,而把文件、菜单、页面元素等作为另一类,这样构成“用户-角色-权限-资源”的授权模型。而在做数据表建模时,可把功能操作和资源统一管理,也就是都直接与权限表进行关联,这样可能更具便捷性和易扩展性。(见下图)
请留意权限表中有一列“权限类型”,我们根据它的取值来区分是哪一类权限,如“MENU”表示菜单的访问权限、“OPERATION”表示功能模块的操作权限、“FILE”表示文件的修改权限、“ELEMENT”表示页面元素的可见性控制等。
这样设计的好处有二。其一,不需要区分哪些是权限操作,哪些是资源,(实际上,有时候也不好区分,如菜单,把它理解为资源呢还是功能模块权限呢?)。其二,方便扩展,当系统要对新的东西进行权限控制时,我只需要建立一个新的关联表“权限XX关联表”,并确定这类权限的权限类型字符串。
这里要注意的是,权限表与权限菜单关联表、权限菜单关联表与菜单表都是一对一的关系。(文件、页面权限点、功能操作等同理)。也就是每添加一个菜单,就得同时往这三个表中各插入一条记录。这样,可以不需要权限菜单关联表,让权限表与菜单表直接关联,此时,须在权限表中新增一列用来保存菜单的ID,权限表通过“权限类型”和这个ID来区分是种类型下的哪条记录。
到这里,RBAC权限模型的扩展模型的完整设计图如下:
随着系统的日益庞大,为了方便管理,可引入角色组对角色进行分类管理,跟用户组不同,角色组不参与授权。例如:某电网系统的权限管理模块中,角色就是挂在区局下,而区局在这里可当作角色组,它不参于权限分配。另外,为方便上面各主表自身的管理与查找,可采用树型结构,如菜单树、功能树等,当然这些可不需要参于权限分配。
以上,是从基本的RBAC模型进行了扩展,具体的设计要根据项目业务的需要作调整。欢迎大家提出批评意见!
george_space的“权限控制”的部分数据模型 Top
有时候需要单独为一个用户增加一两个权限的,这时候单独为这个用户设计一个“角色”,不值得,所以我设计的是:既可以通过角色为用户分配权限,也可以直接将权限分配给用户。
--------------------------------------------
我接触过的几个开发人员,都不明白为什么要直接给用户分配权限,但是在软件的实际应用中,如果完全基于“角色”为人员分配权限,你会 发现角色之间重复、冗余的权限很多,这样反复的定义多种多样的“角色”,还不如设计成可以直接为人员分配权限呢。
--------------------------------------------
权限管理基本上分为以下几个步骤:
1、定义权限-》定义角色-》为人员分配角色(或者直接分配权限),这是一个分配权限的过程;
--------------------------------------------
2、定义受保护资源-》为“受保护资源”指定授权权限,这是一个授权的过程;
--------------------------------------------
3、应用程序请求“受保护资源”-》“受保护资源”的授权权限与人员持有的权限进行匹配-》匹配成功,允许访问资源,匹配失败,不允许访问资源,这是一个认证的过程。
--------------------------------------------
上面这三个过程,是典型的“操作权限”的流程。
--------------------------------------------
关于“页面元素”的控制,目前多数权限管理系统,都是用“自定义权限标签”来控制页面元素的显示与否的。
我目前也是这样实现的,但是我一直认为:其实用“自定义权限标签”来控制页面元素的显示与否,跟直接在视图中使用程序逻辑判断,是一样的,并没有做到“灵活配置”,当权限编码改变,或者权限含义改变时,还是要去动页面的标签,所以跟写死没什么分别。
如果页面元素是通过服务端组装成json,或者别的格式的数据,然后返回到视图层进行渲染,这样的话,就可以做到“页面元素的权限灵活配置了”,可以通过数据库定义那些按钮对那些权限或角色进行显示。
“服务端组装视图层组件,返回视图层渲染”,这个模式虽然做到了“对页面元素的权限灵活配置”,但是牺牲掉了很多东西,比如加大了服务端的复杂度,使得页面的设计更加“程序员化”,而不是“美工化”等。
--------------------------------------------
至于最关键的“数据权限”,也就是人员对数据的读取深度的控制,是更为复杂的流程。
--------------------------------------------
对于“数据深度”的控制,我目前的做法是和业务结合的非常紧密,即:在读取数据的程序中,比如“列表”页,首先判断当前登陆者有没有“读取任意深度的权限”,如果有,就不做读取限制;如果没有,则判断当前登录人员是不是部门主管,如果是,则递归读取本部门下的所有数据,如果不是主管,则只读取自己的数据。
--------------------------------------------
“数据深度”的控制,细设计的话,应该可以更通用,更灵活,大家有什么更好的思路,可以讨论一下。
--------------------------------------------
我目前设计的是一个人员只能有一个“角色”,当然,如果设计成一个人员有多个“角色”,也不是很复杂的事情,在“用户表”和“角色表”之间增加一个“用户-角色映射表”就可以了,但是为了系统的简单起见,我把这种设计简化了。
--------------------------------------------
以下是我的“权限控制”的部分数据模型:
我目前比较关心的是:
1、数据权限(读取数据的深度)有什么更通用的设计?
2、页面元素的控制,除了使用“自定义权限标签”,或者“服务端组装视图层组件”两种方法,还有没有更好的设计?
sdnasky和george_space关于该问题的精彩探讨 Top
sdnasky 写道
数据模型不是关键,只要保存用户-权限关系就行了
设计上的关键是找到权限控制点
界面级:自定义标签可以实现
URL级:Filter可以实现
后台方法级:AOP可以实现
数据级:良好设计+AOP可以实现
即使没有良好的设计,针对不同需求,在控制点写拦截处理类就行了,只是重复代码的问题
权限的关键是:找到控制点,拦截,然后做你想做的事情
george_space 写道
• sdnasky写到:
• 界面级:自定义标签可以实现
我现在也是使用自定义标签来实现的界面元素控制:
问题:现在标签中定义拥有“saveOrder”权限的人,可以看见保存订单的按钮,但是项目交给客户以后,客户想让拥有“kissGirl”权限的人,也能看见保存订单按钮,那么你是不是要去修改页面?
这样每次权限定义发生变动,都要去修改页面自定义标签,跟硬编码写死权限判断有什么分别?
• sdnasky写到:
• 数据级:良好设计+AOP可以实现
问题:怎么实现?这个是关键!
举个简单的例子:
一个列表页,要求:普通员工看见自己发表的信息(标题、发布时间);
部门经理看见本部门的信息(标题、发布时间 + 发布人积分);
管理员看见所有的信息(标题、发布时间、发布人积分 + 删除/修改)按钮。
这个列表页是使用web service从美国加利福尼亚州总部读取的,问,如何实现数据权限控制?
这样的需求,不是一个小小的AOP拦截就能够搞定的,即使能搞定,其复杂度也是超乎想象的。
有一个比较笨的方法,就是在服务端做权限逻辑判断,组装出当前权限应该看到的数据量和数据列,然后使用json
格式传递到视图层进行渲染,这样就相当于把视图端自定义标签所做的判断,移动到了服务端。
服务端使用策略模式,针对不同的权限,执行不同的查询逻辑;
如果有新的查询逻辑出来,就更麻烦了,理论上可以使用“页面上可视化配置 = > 动态生成java类 => 动态加载新的查询逻辑类 => 动态执行新的查询逻辑类”这样的方式来把新逻辑插入当前的判断中,但是这仅仅是理论上的设计,实际做起来,可不是上面这样三言两语能够“说”完的。
要做到数据权限的精确控制,除了和系统紧密耦合的做法和硬编码判断的做法,我还没有发现更好的实现,请楼下大牛们赶紧赐教。
sdnasky 写道
1.标签使用错误,界面标签只是标识出该控制点的唯一标识,剩下的事情由标签处理函数去取出用户权限列表,并且判断用户是否含有该权限点的唯一标识
权限标识可以使用命名规则,用来区分不同类型权限:菜单,界面控件,或其他的
2.取数据的方法如果设计合理,预留了可以方便添加数据过滤的接口,用AOP拦截方法调用,修改输入参数即可
即使设计不好,用AOP拦截方法调用(不调用现有方法),直接调用全新的含有数据过滤的取数据方法即可,无非是有重复代码而已
补充一句不是“小小的AOP” AOP是非常强大的,它是代理模式,既然都给我代理,我就可以为所欲为(拦截调用,修改参数,修改返回值,甚至调用全新的方法),都为所欲为了,还不够强大么?
george_space 写道
1、我的权限标签支持ant式过滤的,类似下面:
Html代码
但是问题的关键是:如果现在客户要求“user.teamleader.*”也能保存订单,你是不是要把“user.teamleader.*”手动添加到权限标签里面去?是不是要改动视图层页面?是不是跟修改硬编码也简单不到哪里去?
2、AOP方式没有亲身实践过,不知道是否行得通,不做评论。
下面是我现在的初步设计,总体的意图是将查询逻辑留给软件部署者来在界面中配置:
执行阶段时序图:
sdnasky 写道
实际解决上述两个case
1. 页面标识出该页面保存按钮权限id为xxx.jsp.saveorder,谁拥有这个标识谁就能访问,“拥有“saveOrder”权限的人”和“拥有“kissGirl”权限的人”都是角色,都不是最细致的针对唯一权限标识点,不管你用什么数据模型,找到 用户-权限唯一标识 关系即可
2.如果美国总部“设计良好”提供了方便添加过滤条件的参数,AOP拦截调用修改传入参数即可,即使美国总部是猪,没关系,AOP获得返回结果,针对返回结果编写处理类,然后将处理之后的结果返回即可,至于界面上的“删除/修改 按钮”,留给界面级权限模块处理,同上甚至有跟多要求,针对每一条数据处理都不一样,比如张山可以“删除/修改 按钮”135条,李四可以“删除/修改 按钮”2468条,都没问题,权限标识
xxx.jsp.deleteupdate.1
xxx.jsp.deleteupdate.2
xxx.jsp.deleteupdate.3
xxx.jsp.deleteupdate.4
xxx.jsp.deleteupdate.5
...
标识后接上ID即可,至于处理标签如何处理,根据规则来就行了
最后共享一个这边的权限设计
其他数据模型不看了
权限表含有3个字段
expression 可以为空,该权限控制点的处理表达式
script 可以为空,该权限控制点的处理表脚本
handle 可以为空,该权限控制点的处理表类
系统需要引入脚本引擎,我们这里用的是jbpm的脚本引擎,最后搞不定就只有反射处理类出马了,不要指望用户直接写脚本,用户最多自己写简单expression 什么 money>10000 , level=经理 啥的,如果用户有特殊需求,根据情况,我们写好script或者handle提供用户下拉选择,填写参数。
george_space, 关键是你们的权限标签保存的不是权限点,而是角色,因此没辙
权限标签就是标识出,这块范围的权限标识就可以了,权限点跟角色的关系交给数据库动态处理就行了
至于有无权限的判定处理,默认处理,表达式,脚本,处理类,各种工具提供选择
george_space 写道
我的权限标签,既可以制定一个或若干个权限,或者使用 user.*这样的ant通配符,
也可以制定一个或若干个角色,或者使用role.*这样的ant通配符,
我的权限系统是我自己设计的,因此不存在受制于人不便修改的问题。
如果有更好的实现方式,我很乐意及时来改进,关键是到现在为止,我还没发现比我的权限标签更通用,更智能的“新标签方式”
使用标签方式控制页面元素,本身就是一种硬编码的变通写法,如果再使用标签来控制列表页的列数量,那简直就是硬编码中的战斗硬,金刚石中的硬钻头,硬到无地自容了,没有任何通用性可言。
使用权限标签来定义页面元素的显示、隐藏,定义列表页的列数量,这样的做法只能适用于项目型软件,不适用或者说不能完全适用于产品型软件。
你说的标签方式我理解,就是:
标签定义一个ID="helloGirl" => 标签实现类中判断当前登录者的权限列表,遍历权限所管辖的所有页面元素ID,看看是否包含本标签的ID:helloGirl => 如果包含,显示标签body,如果不包含,不显示标签body
是不是这个意思?
sdnasky 写道
是的,不过"helloGirl"容易引起歧义,我们的做法是命名规则 页面.模块.控件
如果权限id为 xxx.jsp.xx.btnSave,你看不就解决了你的问题了么
通配符应该作为角色-权限关系存于数据库,你们的问题就是由于通配符引起的,一个点就是一个点,要1对多就用数据库存关系
为什么自定义权限标签无法控制列?当然可以啦
每个列一个权限标识,有标识,显示,没有标识忽略
权限标签加在populate单元格上
其他ITeye会员关于此问题的回复 Top
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 共同关注。
权限控制应该是分为3类:
1. 菜单级别
2. 页面元素级别
3. 数据级别
目前好像用的比较多的是基于RBAC的,我经常用的也就是控制到菜单级别,对于控制页面元素和数据级别用的不是很多,目前需要解决权限控制到页面元素级别,网上看了很多但是不是很明白。不知大家有什么好的解决方案没有。大家的表都是怎样设计的?希望高手们不吝指点,有什么好的方案让借鉴借鉴。
我的目前表主要就包括5张:
用户表;角色表;菜单表(包括一级菜单、二级菜单) ;用户和角色的关联表(用户角色多对多);角色和菜单的关联表等。
RBAC(基于角色的访问控制)扫盲贴 Top
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。(如下图)
角色是什么?可以理解为一定数量的权限的集合,权限的载体。例如:一个论坛系统,“超级管理员”、“版主”都是角色。版主可管理版内的帖子、可管理版内的用户等,这些是权限。要给某个用户授予这些权限,不需要直接将权限授予用户,可将“版主”这个角色赋予该用户。
当用户的数量非常大时,要给系统每个用户逐一授权(授角色),是件非常烦琐的事情。这时,就需要给用户分组,每个用户组内有多个用户。除了可给用户授权外,还可以给用户组授权。这样一来,用户拥有的所有权限,就是用户个人拥有的权限与该用户所在用户组拥有的权限之和。(下图为用户组、用户与角色三者的关联关系)
在应用系统中,权限表现成什么?对功能模块的操作,对上传文件的删改,菜单的访问,甚至页面上某个按钮、某个图片的可见性控制,都可属于权限的范畴。有些权限设计,会把功能操作作为一类,而把文件、菜单、页面元素等作为另一类,这样构成“用户-角色-权限-资源”的授权模型。而在做数据表建模时,可把功能操作和资源统一管理,也就是都直接与权限表进行关联,这样可能更具便捷性和易扩展性。(见下图)
请留意权限表中有一列“权限类型”,我们根据它的取值来区分是哪一类权限,如“MENU”表示菜单的访问权限、“OPERATION”表示功能模块的操作权限、“FILE”表示文件的修改权限、“ELEMENT”表示页面元素的可见性控制等。
这样设计的好处有二。其一,不需要区分哪些是权限操作,哪些是资源,(实际上,有时候也不好区分,如菜单,把它理解为资源呢还是功能模块权限呢?)。其二,方便扩展,当系统要对新的东西进行权限控制时,我只需要建立一个新的关联表“权限XX关联表”,并确定这类权限的权限类型字符串。
这里要注意的是,权限表与权限菜单关联表、权限菜单关联表与菜单表都是一对一的关系。(文件、页面权限点、功能操作等同理)。也就是每添加一个菜单,就得同时往这三个表中各插入一条记录。这样,可以不需要权限菜单关联表,让权限表与菜单表直接关联,此时,须在权限表中新增一列用来保存菜单的ID,权限表通过“权限类型”和这个ID来区分是种类型下的哪条记录。
到这里,RBAC权限模型的扩展模型的完整设计图如下:
随着系统的日益庞大,为了方便管理,可引入角色组对角色进行分类管理,跟用户组不同,角色组不参与授权。例如:某电网系统的权限管理模块中,角色就是挂在区局下,而区局在这里可当作角色组,它不参于权限分配。另外,为方便上面各主表自身的管理与查找,可采用树型结构,如菜单树、功能树等,当然这些可不需要参于权限分配。
以上,是从基本的RBAC模型进行了扩展,具体的设计要根据项目业务的需要作调整。欢迎大家提出批评意见!
george_space的“权限控制”的部分数据模型 Top
有时候需要单独为一个用户增加一两个权限的,这时候单独为这个用户设计一个“角色”,不值得,所以我设计的是:既可以通过角色为用户分配权限,也可以直接将权限分配给用户。
--------------------------------------------
我接触过的几个开发人员,都不明白为什么要直接给用户分配权限,但是在软件的实际应用中,如果完全基于“角色”为人员分配权限,你会 发现角色之间重复、冗余的权限很多,这样反复的定义多种多样的“角色”,还不如设计成可以直接为人员分配权限呢。
--------------------------------------------
权限管理基本上分为以下几个步骤:
1、定义权限-》定义角色-》为人员分配角色(或者直接分配权限),这是一个分配权限的过程;
--------------------------------------------
2、定义受保护资源-》为“受保护资源”指定授权权限,这是一个授权的过程;
--------------------------------------------
3、应用程序请求“受保护资源”-》“受保护资源”的授权权限与人员持有的权限进行匹配-》匹配成功,允许访问资源,匹配失败,不允许访问资源,这是一个认证的过程。
--------------------------------------------
上面这三个过程,是典型的“操作权限”的流程。
--------------------------------------------
关于“页面元素”的控制,目前多数权限管理系统,都是用“自定义权限标签”来控制页面元素的显示与否的。
我目前也是这样实现的,但是我一直认为:其实用“自定义权限标签”来控制页面元素的显示与否,跟直接在视图中使用程序逻辑判断,是一样的,并没有做到“灵活配置”,当权限编码改变,或者权限含义改变时,还是要去动页面的标签,所以跟写死没什么分别。
如果页面元素是通过服务端组装成json,或者别的格式的数据,然后返回到视图层进行渲染,这样的话,就可以做到“页面元素的权限灵活配置了”,可以通过数据库定义那些按钮对那些权限或角色进行显示。
“服务端组装视图层组件,返回视图层渲染”,这个模式虽然做到了“对页面元素的权限灵活配置”,但是牺牲掉了很多东西,比如加大了服务端的复杂度,使得页面的设计更加“程序员化”,而不是“美工化”等。
--------------------------------------------
至于最关键的“数据权限”,也就是人员对数据的读取深度的控制,是更为复杂的流程。
--------------------------------------------
对于“数据深度”的控制,我目前的做法是和业务结合的非常紧密,即:在读取数据的程序中,比如“列表”页,首先判断当前登陆者有没有“读取任意深度的权限”,如果有,就不做读取限制;如果没有,则判断当前登录人员是不是部门主管,如果是,则递归读取本部门下的所有数据,如果不是主管,则只读取自己的数据。
--------------------------------------------
“数据深度”的控制,细设计的话,应该可以更通用,更灵活,大家有什么更好的思路,可以讨论一下。
--------------------------------------------
我目前设计的是一个人员只能有一个“角色”,当然,如果设计成一个人员有多个“角色”,也不是很复杂的事情,在“用户表”和“角色表”之间增加一个“用户-角色映射表”就可以了,但是为了系统的简单起见,我把这种设计简化了。
--------------------------------------------
以下是我的“权限控制”的部分数据模型:
我目前比较关心的是:
1、数据权限(读取数据的深度)有什么更通用的设计?
2、页面元素的控制,除了使用“自定义权限标签”,或者“服务端组装视图层组件”两种方法,还有没有更好的设计?
sdnasky和george_space关于该问题的精彩探讨 Top
sdnasky 写道
数据模型不是关键,只要保存用户-权限关系就行了
设计上的关键是找到权限控制点
界面级:自定义标签可以实现
URL级:Filter可以实现
后台方法级:AOP可以实现
数据级:良好设计+AOP可以实现
即使没有良好的设计,针对不同需求,在控制点写拦截处理类就行了,只是重复代码的问题
权限的关键是:找到控制点,拦截,然后做你想做的事情
george_space 写道
• sdnasky写到:
• 界面级:自定义标签可以实现
我现在也是使用自定义标签来实现的界面元素控制:
<eagle:hasPermission name="saveOrder"> <input type="image" src="${rootUriOfCurrentPage}/resources/image/button/save-order.png" name="submit_top_button" id="submit_top_button" value="保存订单" /> </eagle:hasPermission>
<eagle:hasPermission name="saveOrder"> <input type="image" src="${rootUriOfCurrentPage}/resources/image/button/save-order.png" name="submit_top_button" id="submit_top_button" value="保存订单" /> </eagle:hasPermission>
问题:现在标签中定义拥有“saveOrder”权限的人,可以看见保存订单的按钮,但是项目交给客户以后,客户想让拥有“kissGirl”权限的人,也能看见保存订单按钮,那么你是不是要去修改页面?
这样每次权限定义发生变动,都要去修改页面自定义标签,跟硬编码写死权限判断有什么分别?
• sdnasky写到:
• 数据级:良好设计+AOP可以实现
问题:怎么实现?这个是关键!
举个简单的例子:
一个列表页,要求:普通员工看见自己发表的信息(标题、发布时间);
部门经理看见本部门的信息(标题、发布时间 + 发布人积分);
管理员看见所有的信息(标题、发布时间、发布人积分 + 删除/修改)按钮。
这个列表页是使用web service从美国加利福尼亚州总部读取的,问,如何实现数据权限控制?
这样的需求,不是一个小小的AOP拦截就能够搞定的,即使能搞定,其复杂度也是超乎想象的。
有一个比较笨的方法,就是在服务端做权限逻辑判断,组装出当前权限应该看到的数据量和数据列,然后使用json
格式传递到视图层进行渲染,这样就相当于把视图端自定义标签所做的判断,移动到了服务端。
服务端使用策略模式,针对不同的权限,执行不同的查询逻辑;
如果有新的查询逻辑出来,就更麻烦了,理论上可以使用“页面上可视化配置 = > 动态生成java类 => 动态加载新的查询逻辑类 => 动态执行新的查询逻辑类”这样的方式来把新逻辑插入当前的判断中,但是这仅仅是理论上的设计,实际做起来,可不是上面这样三言两语能够“说”完的。
要做到数据权限的精确控制,除了和系统紧密耦合的做法和硬编码判断的做法,我还没有发现更好的实现,请楼下大牛们赶紧赐教。
sdnasky 写道
1.标签使用错误,界面标签只是标识出该控制点的唯一标识,剩下的事情由标签处理函数去取出用户权限列表,并且判断用户是否含有该权限点的唯一标识
<eagle:hasPermission id="xxx.jsp.saveorder"> <input type="image" src="${rootUriOfCurrentPage}/resources/image/button/save-order.png" name="submit_top_button" id="submit_top_button" value="保存订单" /> </eagle:hasPermission> <eagle:hasPermission id="xxx.jsp.saveorder"> <input type="image" src="${rootUriOfCurrentPage}/resources/image/button/save-order.png" name="submit_top_button" id="submit_top_button" value="保存订单" /> </eagle:hasPermission>
权限标识可以使用命名规则,用来区分不同类型权限:菜单,界面控件,或其他的
2.取数据的方法如果设计合理,预留了可以方便添加数据过滤的接口,用AOP拦截方法调用,修改输入参数即可
即使设计不好,用AOP拦截方法调用(不调用现有方法),直接调用全新的含有数据过滤的取数据方法即可,无非是有重复代码而已
补充一句不是“小小的AOP” AOP是非常强大的,它是代理模式,既然都给我代理,我就可以为所欲为(拦截调用,修改参数,修改返回值,甚至调用全新的方法),都为所欲为了,还不够强大么?
george_space 写道
1、我的权限标签支持ant式过滤的,类似下面:
Html代码
<eagle:hasPermission id="user.customer.*,user.manager.*"> <input type="image" src="${rootUriOfCurrentPage}/resources/image/button/save-order.png" name="submit_top_button" id="submit_top_button" value="保存订单" /> </eagle:hasPermission>
<eagle:hasPermission id="user.customer.*,user.manager.*"> <input type="image" src="${rootUriOfCurrentPage}/resources/image/button/save-order.png" name="submit_top_button" id="submit_top_button" value="保存订单" /> </eagle:hasPermission>
但是问题的关键是:如果现在客户要求“user.teamleader.*”也能保存订单,你是不是要把“user.teamleader.*”手动添加到权限标签里面去?是不是要改动视图层页面?是不是跟修改硬编码也简单不到哪里去?
2、AOP方式没有亲身实践过,不知道是否行得通,不做评论。
下面是我现在的初步设计,总体的意图是将查询逻辑留给软件部署者来在界面中配置:
执行阶段时序图:
sdnasky 写道
实际解决上述两个case
1. 页面标识出该页面保存按钮权限id为xxx.jsp.saveorder,谁拥有这个标识谁就能访问,“拥有“saveOrder”权限的人”和“拥有“kissGirl”权限的人”都是角色,都不是最细致的针对唯一权限标识点,不管你用什么数据模型,找到 用户-权限唯一标识 关系即可
2.如果美国总部“设计良好”提供了方便添加过滤条件的参数,AOP拦截调用修改传入参数即可,即使美国总部是猪,没关系,AOP获得返回结果,针对返回结果编写处理类,然后将处理之后的结果返回即可,至于界面上的“删除/修改 按钮”,留给界面级权限模块处理,同上甚至有跟多要求,针对每一条数据处理都不一样,比如张山可以“删除/修改 按钮”135条,李四可以“删除/修改 按钮”2468条,都没问题,权限标识
xxx.jsp.deleteupdate.1
xxx.jsp.deleteupdate.2
xxx.jsp.deleteupdate.3
xxx.jsp.deleteupdate.4
xxx.jsp.deleteupdate.5
...
标识后接上ID即可,至于处理标签如何处理,根据规则来就行了
最后共享一个这边的权限设计
其他数据模型不看了
权限表含有3个字段
expression 可以为空,该权限控制点的处理表达式
script 可以为空,该权限控制点的处理表脚本
handle 可以为空,该权限控制点的处理表类
系统需要引入脚本引擎,我们这里用的是jbpm的脚本引擎,最后搞不定就只有反射处理类出马了,不要指望用户直接写脚本,用户最多自己写简单expression 什么 money>10000 , level=经理 啥的,如果用户有特殊需求,根据情况,我们写好script或者handle提供用户下拉选择,填写参数。
george_space, 关键是你们的权限标签保存的不是权限点,而是角色,因此没辙
权限标签就是标识出,这块范围的权限标识就可以了,权限点跟角色的关系交给数据库动态处理就行了
至于有无权限的判定处理,默认处理,表达式,脚本,处理类,各种工具提供选择
george_space 写道
我的权限标签,既可以制定一个或若干个权限,或者使用 user.*这样的ant通配符,
也可以制定一个或若干个角色,或者使用role.*这样的ant通配符,
我的权限系统是我自己设计的,因此不存在受制于人不便修改的问题。
如果有更好的实现方式,我很乐意及时来改进,关键是到现在为止,我还没发现比我的权限标签更通用,更智能的“新标签方式”
使用标签方式控制页面元素,本身就是一种硬编码的变通写法,如果再使用标签来控制列表页的列数量,那简直就是硬编码中的战斗硬,金刚石中的硬钻头,硬到无地自容了,没有任何通用性可言。
使用权限标签来定义页面元素的显示、隐藏,定义列表页的列数量,这样的做法只能适用于项目型软件,不适用或者说不能完全适用于产品型软件。
你说的标签方式我理解,就是:
标签定义一个ID="helloGirl" => 标签实现类中判断当前登录者的权限列表,遍历权限所管辖的所有页面元素ID,看看是否包含本标签的ID:helloGirl => 如果包含,显示标签body,如果不包含,不显示标签body
是不是这个意思?
sdnasky 写道
是的,不过"helloGirl"容易引起歧义,我们的做法是命名规则 页面.模块.控件
如果权限id为 xxx.jsp.xx.btnSave,你看不就解决了你的问题了么
通配符应该作为角色-权限关系存于数据库,你们的问题就是由于通配符引起的,一个点就是一个点,要1对多就用数据库存关系
为什么自定义权限标签无法控制列?当然可以啦
每个列一个权限标识,有标识,显示,没有标识忽略
权限标签加在populate单元格上
其他ITeye会员关于此问题的回复 Top
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 共同关注。
发表评论
-
分享JAVA从程序员到架构师之路的各项资料
2016-06-25 15:46 386JAVA架构师视频资料,搭建高并发、高可用电商架构设计资料 ... -
Java线程面试题Top50
2016-02-17 09:47 795不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。 ... -
XSD (xml Schema Definition
2014-12-22 16:33 732XSD (xml Schema Definition) ... -
在Web.xml中自动扫描Spring的配置文件及resource时classpath*:与classpath:的区别
2014-12-22 14:16 0首先在web.xml中配置监听器listener,让Sprin ... -
在Web.xml中自动扫描Spring的配置文件及resource时classpath*:与classpath:的区别
2014-12-22 14:15 0首先在web.xml中配置监听器listener,让Sprin ... -
在Web.xml中自动扫描Spring的配置文件及resource时classpath*:与classpath:的区别
2014-12-22 14:14 5023首先在web.xml中配置监听器listener,让Sprin ... -
转 JAVA读取外部资源的方法
2014-12-22 14:04 1766在java代码中经常有读取外部资源的要求:如配置文件等等,通常 ... -
oscache.properties文件配置
2014-05-28 13:22 9251、cache.memory 是否使用 ... -
oscache 使用总结
2014-05-28 13:21 605前阵子对公司网站进行了性能优化,其中,有一项就是使用OSCac ... -
华为JAVA编程规范
2014-04-18 11:14 1277Java 编程规范 排版 规 ... -
Spring声明式事务配置管理方法
2014-04-16 17:50 731环境配置 项目使用SSH架构,现在要添加Spring事务管理 ... -
Spring MVC和Struts2的比较
2014-04-16 17:29 646虽然说没有系统的学习 ... -
漂浮广告代码、漂浮代码分析(讲解)
2014-04-10 08:47 691总共有三个文件1.htm 主文件、liangbian.js 在 ... -
追MM与23种设计模式
2014-04-10 09:03 1278创建型模式 1、FACTORY— ... -
转 对Spring IoC容器实现的结构分析
2014-04-09 16:39 627本文的目标: 从实现的角度来认识SpringIoC容器。 观 ... -
转 解决json转换hibernate 结果集对象
2014-04-09 16:28 813在使用ext+ssh框架过程 ... -
转:Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别
2014-04-09 16:14 1351Spring事务配置的五种方式 前段时间对Spring的事务 ... -
Spring事务 7个传播行为,4个隔离级别
2014-04-09 16:13 687转载自:http://blog.chinaunix.net/u ... -
java创建实例的几种方法
2014-02-14 10:34 953从大体上分,有三种 1.使用new关键字 2.使用反射 3.序 ... -
基于java反射机制实现javabean转json字符串
2013-09-16 14:13 2532package com.ObjectToJson; impo ...
相关推荐
本篇文章将围绕“Web业务系统权限控制”这一主题展开讨论,详细介绍其中的关键概念和技术细节。 #### 二、核心组件与功能划分 为了实现高效且灵活的权限控制,通常会将系统划分为以下几个关键部分: 1. **业务逻辑...
在IT行业中,尤其是在JavaWeb开发领域,权限控制是构建安全应用程序的关键部分。本文将深入探讨“监听器”、“过滤器”、“登录验证”和“拦截器”这四个核心概念,它们在实现用户权限控制中发挥着重要作用。 首先...
在"企业应用 - Java - JavaEye论坛.mht"文件中,可能包含了关于这个话题的详细讨论和示例代码,读者可以通过阅读文件获取更深入的理解和实践指导。记住,实际开发中还需要考虑其他因素,如安全性、性能优化以及与...
接下来,我们讨论权限控制。Windows为每个句柄分配了一组访问权利,这些权利定义了进程可以对对象执行的操作。例如,一个文件句柄可能允许读取、写入或删除文件。权限由一系列位标志组成,这些标志指示哪些操作被...
当我们谈论“spring+shiro 增删改查权限控制”时,我们实际上是在讨论如何利用这两个框架实现对应用程序数据操作的权限管理和用户认证。 首先,Spring框架提供了模型-视图-控制器(MVC)架构模式,使得开发者可以更...
文章首先介绍了项目中权限控制的需求,接着讨论了 zwei 疑惑:一是是否应该在底层截取用户权限,控制用户对方法或者类的访问;二是权限设计的思想,包括primeton的想法,将权限控制的理念抽取出来,单独做成一套权限...
在Java编程语言中,"委托"和"代理"是一种重要的设计模式,它们在权限控制方面发挥着关键作用。本文将深入探讨Java中的委托控制权限,主要聚焦于JDK代理(Proxy)的使用。 首先,我们要理解什么是委托。在软件工程中...
在IT行业中,权限控制是系统安全的关键组成部分,尤其在企业级应用中,对用户权限的精细化管理至关重要。本文将深入探讨“基于位运算的权限细粒度控制”这一主题,结合给定的标签“源码”和“工具”,我们将探讨如何...
下面我们将详细讨论Filter的工作原理以及`UserRoleFilter`如何实现页面访问权限控制: 1. **Filter生命周期**: - **初始化**:当Filter被加载时,会调用`init(FilterConfig filterConfig)`方法。在这个方法中,`...
5. 安全性考虑:讨论如何保证权限控制的安全性和隐私保护。 6. 示例与应用场景:提供实际示例展示权限控制的运用。 7. 测试与评估:描述测试计划和性能评估标准。 8. 变更历史与未来规划:记录设计的变更历史,并...
在IT行业中,权限控制是系统安全的关键组成部分,特别是在企业级应用和复杂软件系统中。"基本的权限控制模块测试工程"是一个专为测试权限管理功能而设计的项目,旨在模拟和验证不同用户、角色和组织在系统中的权限...
接着,我们要讨论菜单权限控制。在企业级应用中,权限管理是非常关键的一环,确保用户只能看到和操作他们被授权的功能。这通常涉及到数据库的设计,包括角色、用户、权限等表。开发者可能创建了一个或多个表来存储...
### 企业USB权限控制策略详解 #### 一、任务背景与目标 在当前的企业环境中,保护内部信息安全成为了不可忽视的任务之一。随着移动存储设备的普及和技术的发展,通过USB接口非法复制公司机密资料的风险日益增加。...
首先,Apache Shiro是一个强大且易用的Java安全框架,主要用于身份认证、授权(权限控制)和会话管理。在这个项目中,Shiro作为核心的权限管理组件,负责处理用户的身份验证、角色分配以及对资源的访问控制。Shiro...
对象权限控制着用户可以对特定对象执行的操作,如 select、insert、update 和 delete 等。 在本文中,我们将讨论 Oracle 数据库权限管理的重要性、Sysman 账户的重要性和解锁方法。 一、 Oracle 数据库权限管理的...
在智能家居系统中,Intent与权限控制是Android操作系统中不可或缺的部分,它们对于确保用户隐私和系统安全至关重要。Intent是Android中的一个关键概念,用于在应用程序组件之间传递消息或启动操作,而权限控制则决定...
下面,我们基于上述原理,讨论如何使用模板方法模式实现一个通用的权限控制系统。 ##### 抽象类定义 首先,定义一个抽象基类`CRightBase`,其中包含了所有可能的权限(如添加、编辑、删除等),以及用于执行这些...
【Subversion 精细权限控制】 Subversion(简称svn)是一个开源的版本控制系统,用于管理文件和目录的变更历史。在Subversion中,权限控制是确保项目安全和团队协作的关键部分。它提供了两种主要的安全机制:认证...
本文主要讨论的是如何在基于Spring框架的应用中实现权限控制系统,特别提到了Acegi安全框架的使用。Spring框架是一个流行的多层J2EE应用框架,它提供了IoC(控制反转)和AOP(面向切面编程)功能,但本身并不包含...
在IT行业中,Windows操作系统下的权限控制是至关重要的,尤其是在开发应用程序时。VC++(Microsoft Visual C++)作为一款强大的C++集成开发环境,为开发者提供了丰富的API和库,使得实现权限自动化控制成为可能。本...