ITeye论坛中关于权限控制的帖子非常之精彩,现将其精华内容摘录于下。
目 录 [ - ]
楼主关于权限控制的问题
1. 菜单级别
2. 页面元素级别
3. 数据级别
目前好像用的比较多的是基于RBAC的,我经常用的也就是控制到菜单级别,对于控制页面元素和数据级别用的不是很多,目前需要解决权限控制到页面元素级别,网上看了很多但是不是很明白。不知大家有什么好的解决方案没有。大家的表都是怎样设计的?希望高手们不吝指点,有什么好的方案让借鉴借鉴。
我的目前表主要就包括5张:
用户表;角色表;菜单表(包括一级菜单、二级菜单) ;用户和角色的关联表(用户角色多对多);角色和菜单的关联表等。
RBAC(基于角色的访问控制)扫盲贴




随着系统的日益庞大,为了方便管理,可引入角色组对角色进行分类管理,跟用户组不同,角色组不参与授权。例如:某电网系统的权限管理模块中,角色就是挂在区局下,而区局在这里可当作角色组,它不参于权限分配。另外,为方便上面各主表自身的管理与查找,可采用树型结构,如菜单树、功能树等,当然这些可不需要参于权限分配。
george_space的“权限控制”的部分数据模型
有时候需要单独为一个用户增加一两个权限的,这时候单独为这个用户设计一个“角色”,不值得,所以我设计的是:既可以通过角色为用户分配权限,也可以直接将权限分配给用户。
--------------------------------------------
我接触过的几个开发人员,都不明白为什么要直接给用户分配权限,但是在软件的实际应用中,如果完全基于“角色”为人员分配权限,你会 发现角色之间重复、冗余的权限很多,这样反复的定义多种多样的“角色”,还不如设计成可以直接为人员分配权限呢。
--------------------------------------------
权限管理基本上分为以下几个步骤:
1、定义权限-》定义角色-》为人员分配角色(或者直接分配权限),这是一个分配权限的过程;
--------------------------------------------
2、定义受保护资源-》为“受保护资源”指定授权权限,这是一个授权的过程;
--------------------------------------------
3、应用程序请求“受保护资源”-》“受保护资源”的授权权限与人员持有的权限进行匹配-》匹配成功,允许访问资源,匹配失败,不允许访问资源,这是一个认证的过程。
--------------------------------------------
上面这三个过程,是典型的“操作权限”的流程。
--------------------------------------------
关于“页面元素”的控制,目前多数权限管理系统,都是用“自定义权限标签”来控制页面元素的显示与否的。
我目前也是这样实现的,但是我一直认为:其实用“自定义权限标签”来控制页面元素的显示与否,跟直接在视图中使用程序逻辑判断,是一样的,并没有做到“灵活配置”,当权限编码改变,或者权限含义改变时,还是要去动页面的标签,所以跟写死没什么分别。
如果页面元素是通过服务端组装成json,或者别的格式的数据,然后返回到视图层进行渲染,这样的话,就可以做到“页面元素的权限灵活配置了”,可以通过数据库定义那些按钮对那些权限或角色进行显示。
“服务端组装视图层组件,返回视图层渲染”,这个模式虽然做到了“对页面元素的权限灵活配置”,但是牺牲掉了很多东西,比如加大了服务端的复杂度,使得页面的设计更加“程序员化”,而不是“美工化”等。
--------------------------------------------
至于最关键的“数据权限”,也就是人员对数据的读取深度的控制,是更为复杂的流程。
--------------------------------------------
对于“数据深度”的控制,我目前的做法是和业务结合的非常紧密,即:在读取数据的程序中,比如“列表”页,首先判断当前登陆者有没有“读取任意深度的权限”,如果有,就不做读取限制;如果没有,则判断当前登录人员是不是部门主管,如果是,则递归读取本部门下的所有数据,如果不是主管,则只读取自己的数据。
--------------------------------------------
“数据深度”的控制,细设计的话,应该可以更通用,更灵活,大家有什么更好的思路,可以讨论一下。
--------------------------------------------
我目前设计的是一个人员只能有一个“角色”,当然,如果设计成一个人员有多个“角色”,也不是很复杂的事情,在“用户表”和“角色表”之间增加一个“用户-角色映射表”就可以了,但是为了系统的简单起见,我把这种设计简化了。
--------------------------------------------
以下是我的“权限控制”的部分数据模型:

我目前比较关心的是:
1、数据权限(读取数据的深度)有什么更通用的设计?
2、页面元素的控制,除了使用“自定义权限标签”,或者“服务端组装视图层组件”两种方法,还有没有更好的设计?
sdnasky和george_space关于该问题的精彩探讨
设计上的关键是找到权限控制点
界面级:自定义标签可以实现
URL级:Filter可以实现
后台方法级:AOP可以实现
数据级:良好设计+AOP可以实现
即使没有良好的设计,针对不同需求,在控制点写拦截处理类就行了,只是重复代码的问题
权限的关键是:找到控制点,拦截,然后做你想做的事情
• 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>
问题:现在标签中定义拥有“saveOrder”权限的人,可以看见保存订单的按钮,但是项目交给客户以后,客户想让拥有“kissGirl”权限的人,也能看见保存订单按钮,那么你是不是要去修改页面?
这样每次权限定义发生变动,都要去修改页面自定义标签,跟硬编码写死权限判断有什么分别?
• sdnasky写到:
• 数据级:良好设计+AOP可以实现
问题:怎么实现?这个是关键!
举个简单的例子:
一个列表页,要求:普通员工看见自己发表的信息(标题、发布时间);
部门经理看见本部门的信息(标题、发布时间 + 发布人积分);
管理员看见所有的信息(标题、发布时间、发布人积分 + 删除/修改)按钮。
这个列表页是使用web service从美国加利福尼亚州总部读取的,问,如何实现数据权限控制?
这样的需求,不是一个小小的AOP拦截就能够搞定的,即使能搞定,其复杂度也是超乎想象的。
有一个比较笨的方法,就是在服务端做权限逻辑判断,组装出当前权限应该看到的数据量和数据列,然后使用json
格式传递到视图层进行渲染,这样就相当于把视图端自定义标签所做的判断,移动到了服务端。
服务端使用策略模式,针对不同的权限,执行不同的查询逻辑;
如果有新的查询逻辑出来,就更麻烦了,理论上可以使用“页面上可视化配置 = > 动态生成java类 => 动态加载新的查询逻辑类 => 动态执行新的查询逻辑类”这样的方式来把新逻辑插入当前的判断中,但是这仅仅是理论上的设计,实际做起来,可不是上面这样三言两语能够“说”完的。
要做到数据权限的精确控制,除了和系统紧密耦合的做法和硬编码判断的做法,我还没有发现更好的实现,请楼下大牛们赶紧赐教。
<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是非常强大的,它是代理模式,既然都给我代理,我就可以为所欲为(拦截调用,修改参数,修改返回值,甚至调用全新的方法),都为所欲为了,还不够强大么?
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>
但是问题的关键是:如果现在客户要求“user.teamleader.*”也能保存订单,你是不是要把“user.teamleader.*”手动添加到权限标签里面去?是不是要改动视图层页面?是不是跟修改硬编码也简单不到哪里去?
2、AOP方式没有亲身实践过,不知道是否行得通,不做评论。
下面是我现在的初步设计,总体的意图是将查询逻辑留给软件部署者来在界面中配置:

执行阶段时序图:

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, 关键是你们的权限标签保存的不是权限点,而是角色,因此没辙
权限标签就是标识出,这块范围的权限标识就可以了,权限点跟角色的关系交给数据库动态处理就行了
至于有无权限的判定处理,默认处理,表达式,脚本,处理类,各种工具提供选择
也可以制定一个或若干个角色,或者使用role.*这样的ant通配符,
我的权限系统是我自己设计的,因此不存在受制于人不便修改的问题。
如果有更好的实现方式,我很乐意及时来改进,关键是到现在为止,我还没发现比我的权限标签更通用,更智能的“新标签方式”
使用标签方式控制页面元素,本身就是一种硬编码的变通写法,如果再使用标签来控制列表页的列数量,那简直就是硬编码中的战斗硬,金刚石中的硬钻头,硬到无地自容了,没有任何通用性可言。
使用权限标签来定义页面元素的显示、隐藏,定义列表页的列数量,这样的做法只能适用于项目型软件,不适用或者说不能完全适用于产品型软件。
你说的标签方式我理解,就是:
标签定义一个ID="helloGirl" => 标签实现类中判断当前登录者的权限列表,遍历权限所管辖的所有页面元素ID,看看是否包含本标签的ID:helloGirl => 如果包含,显示标签body,如果不包含,不显示标签body
是不是这个意思?
如果权限id为 xxx.jsp.xx.btnSave,你看不就解决了你的问题了么
通配符应该作为角色-权限关系存于数据库,你们的问题就是由于通配符引起的,一个点就是一个点,要1对多就用数据库存关系
为什么自定义权限标签无法控制列?当然可以啦
每个列一个权限标识,有标识,显示,没有标识忽略
权限标签加在populate单元格上
其他ITeye会员关于此问题的回复
数据权限如果有两个或更多维度的话应该如何处理呢?
比如:分地区、类型两种维度
省日化经理只能看本省范围内日化产品的销售情况,城市经理能看到本市范围全部商品的销售情况等等
如果不同的角色对于同一个功能有不同的数据范围要求,如何能设计一个良好的通用模型?
然后用户角色就是RBAC,可以为不同用户分组形成UserGroup,可以为不同权限分组形成Role
不懂的话可以参考Spring Security的实现。
、用户组级的、域级别的...总之很多。
完全基于数据库实现,有兴趣的话自己找找wss/moss权限管理的文章看看
到现在为止我也没办法解决。不放持久层分页就会有多有少,要是少到一条都没有就麻烦了。有一点的话 还糊弄的过去。
其他层次的问题 , 我全部通过AOP 拦截。有时候还要修改拦截的数据,反正搞的权限代码也得理解业务,都不完美。
只是资源里面的 可以多加一个 type 字段 类型可以是 url ,file 等
这样会不会简化了呢
前天一想写这个玩意 ... 郁闷 http://vb2005xu.iteye.com/blog/1136852
发现角色之间重复、冗余的权限很多
关于这个 我说说我的解决方案 roles 表里面加个 字段 parent_id 以此来实现 角色间的继承
1.权限模型选型-基于角色控制的权限模型,组织机构模型等等
2.权限信息维护-尤其是分级权限管理和维护,这个很重要,要做到不失功能的前提下,尽量做的简单实用、切忌复杂化,还要有强大的权限查询和回收功能
3.权限控制api-这个一定要通俗易懂,而且要保证性能,可适当引入缓冲机制
4.权限缓冲同步和刷新-尤其是在集群环境下
5.做到以上几点的前提下,功能级权限和数据级权限就没有问题了,为了降低权限表的数据量,可以在通用权限维护管理的前提下增加按类别划分存放权限数据表的功能
至于权限的划分,应该可以划分为以下三大类:
1.功能权限-系统菜单,页面功能操作点
2.数据权限-业务数据范围权限
3.管理权限-管理功能权限和数据权限的权限
推荐一款开源产品——ralasafe权限管理中间件,内部也是使用规则对数据级策略进行描述。ralasafe还提供了图形界面来实现规则的图形化配置,不必手写配置。
http://www.ralasafe.cn
但是这里还是又一个问题。就是这样做违背了RBAC的模型,我引用了ralasafe权限中间件其中一位commiter的话:“主体和资源种类很多时候,权限控制条目则急剧膨胀条目是N(主体)*N(资源),显然需要有针对性的寻找规律进行分解从而减少数目,可以发现的是如果通过定义有限的角色(R)来替代主体授权则条目数量变化为N*R+R*M,显然角色数量是远远小于主体数量的,从而能够达到简化的母的。这就是RBAC得来源”。因此把上面的用户全部换成角色,基于角色的访问控制将很好的防止了权限的冗余 后期维护也方便。 所以基于页面级的权限控制 我们建议将控制点设置为权限ID或叫资源ID,george_space提出的基于规则的命名 这个后期维护起来将会省很大的力气,另外实现类 就根据权限ID去role_privilege表里查找所有的角色,遍历该角色 查找上下文中用户是否在这些角色中。 ralasafe严格按照RBAC模型 并基于策略的模型实现数据集权限。 网址:www.ralasafe.cn 共同关注。
该话题的讨论还在继续,感兴趣的同学可猛击本页最下面的链接穿越到原帖。


相关推荐
ITeye论坛中关于权限控制的帖子非常之精彩,现将其精华内容摘录于下。 目 录 [ - ] 楼主关于权限控制的问题 RBAC(基于角色的访问控制)扫盲贴 george_space的“权限控制”的部分数据模型 sdnasky和geo....
关于权限控制 ...关于权限控制的讨论源于guoyong123的一个问题: guoyong123 写道 权限控制应该是分为3类: 1. 菜单级别 2. 页面元素级别 3. 数据级别 目前好像用的比较多的是
目前,权限管理系统也是重复开发率最高的模块之一。...目前好像用的比较多的是基于RBAC的,我经常用的也就是控制到菜单级别,对于控制页面元素和数据级别用的不是很多,目前需要解决权限控制到页面元...
@郑昀汇总 名词解释: RBAC:Role-Based Access Control,基于角色的访问控制 关键词: RBAC,Java Shiro,Spring S...
目前,权限管理系统也是重复开发率最高...楼主关于权限控制的问题RBAC(基于角色的访问控制)扫盲贴george_space的“权限控制”的部分数据模型sdnasky和george_space关于该问题的精彩探讨其他ITeye会员关于此问题的回复
不过松哥想说的是,技术都是相通的,明白了 vhr 中权限管理的原理,在此基础上就可以去细化权限管理粒度,细化过程和还是用的 vhr 中用的技术,只不过设计层面重新规划而已。 当然今天我想说的并不是这个话题,主要...
名词解释: RBAC:Role-Based Access Control,基于角色的访问控制 关键词: RBAC,Java Shiro,Spring Security, 一. RBAC 要解决的常见问题 问题一:
RBAC:Role-Based Access Control,基于角色的访问控制 关键词: RBAC,Java Shiro,Spring Security, 一. RBAC 要解决的常见问题 问题一:对某一个用户只授予一些特殊的权限 描述:既不希望扩大某一个...
目录(?)[-] uses-permission自定义permission permission标签permission-tree...组件权限权限检测URI权限androidsharedUserId 总结引用文章 总结整理了一下androi
内容概要:本文围绕“考虑储能和可再生能源误差的售电公司购售电策略”展开,通过构建优化模型,结合Python代码实现,研究售电公司在含有储能系统和可再生能源(如风电、光伏)接入背景下的购电与售电决策策略。重点考虑了可再生能源出力的不确定性(预测误差)对电力市场交易的影响,并引入储能系统作为灵活调节手段,提升售电公司的经济效益与运行鲁棒性。文中详细阐述了数学建模过程,包括目标函数设定(如利润最大化)、约束条件(功率平衡、储能充放电特性、市场报价限制等),并通过Python编程进行仿真验证,分析不同场景下的策略效果。; 适合人群:具备一定电力系统基础知识和Python编程能考虑储能和可再生能源误差的售电公司购售电策略(Python代码实现)力的研究生、科研人员及从事电力市场、能源管理相关工作的技术人员。; 使用场景及目标:①掌握含不确定性可再生能源的电力市场优化建模方法;②学习储能系统在购售电决策中的调度机制;③通过代码实践理解优化问题的求解流程,可用于学术研究或实际售电策略制定参考。; 阅读建议:建议结合文中模型推导与Python代码同步阅读,重点关注目标函数与约束条件的数学表达及其代码实现方式,有条件者可自行调试参数以加深理解。
动态手势的精准识别:基于YOLO系列模型的手部动作检测与分类系统实战
该工具集提供多种文档格式间的双向转换功能,支持包括文本处理文档、网页文件、数据表格、便携式文档、图像文件及标记语言在内的六类常见格式相互转化。通过模块化设计实现了跨格式数据解析与重构,在保持原始内容完整性的同时,可精确转换文本样式、表格结构及页面布局等核心元素。其转换引擎采用分层处理架构,分别针对字符编码、视觉渲染和元数据保真度进行专项优化,确保在不同应用场景下均能维持较高的格式兼容性与内容还原度。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
## 数据指标说明 ## 01、数据简介 自2018年起,美国商务部工业和安全局(BIS)通过《出口管制条例》(EAR)框架下的实体清单政策,持续收紧对中国企业的技术准入。该政策直接影响中国上市公司的关键技术获取、供应链稳定性及国际技术合作。持续升级对中国企业的技术准入限制。这一政策直接冲击中国企业的核心技术创新生态:一方面,通过切断关键技术与零部件的供应链渠道,削弱企业获取高端生产要素的能力;另一方面,通过限制技术转移与国际知识共享,阻碍中国企业在全球技术网络中的资源整合。 本数据为技术封锁的政策效应,即 post*treat。post 为时间虚拟变量,2018年及以前post为0,2018年以后post为1,treat为政策虚拟变量,被列入实体清单的上市公司取值为1,否则为0。 数据名称:上市公司-企业技术封锁DID 数据年份:2014-2024年 数据来源:国际贸易管理局官方网站、上市公司官网 参考文献:[1]姜秀娟,王晓薇.外部知识获取视角下技术封锁对企业突破式创新的影响研究[J/OL].科技进步与对策,1-13[2025-07-31]. ## 02、相关数据 股票代码 公司简称 行业名称 行业代码 省份代码 省份 城市代码 城市 年份 公司全称 treat post DID
本资源包提供了一套采用SpringBoot架构实现的酒店管理平台完整开发材料,适用于高等院校计算机科学与技术、软件工程等相关专业学生在课程设计与毕业设计环节进行实践参考。该资料包整合了经过系统化验证的应用程序源代码及配套数据库文件,所有组件均已完成多轮功能性测试与兼容性核查,用户获取后可通过标准化配置流程直接部署运行。项目内容聚焦酒店业务管理场景的技术实现,涵盖客房状态监控、客户信息管理、订单处理流程等核心模块,每个功能单元均遵循企业级应用开发规范进行编码构建。该教学资源特别注重工程实践的规范性演示,通过分层架构设计与模块化开发模式展现现代软件系统的组织逻辑,可为学习者提供完整的项目开发全流程参考范例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
内容概要:本文围绕单相LC型微网逆变器的控制策略展开研究,重点通过Simulink仿真平台构建系统模型,分析并验证不同控制方法在并网与离网模式下的动态响应、稳定性及电能质量表现。研究涵盖逆变器的数学建模、LC滤波器设计、电压电流双环控制策略、锁相技术以及系统在负载突变或模式切换下的鲁棒性,旨在提升微网逆变器的控制精度与运行可靠性。; 适合人群:电气工程、自动化及相关专业的研究生、科研人员及从事微电网、新能源发电系统开发的工程师。; 使用场景及目标:①掌握单相LC型逆变器的建模与仿真方法;②理解微网逆变器在并网/离网工况下的控制逻辑与切换策略;③为实际微网系统中单相LC型微网逆变器控制研究(Simulink仿真实现)逆变器控制器的设计与优化提供理论依据和技术参考。; 阅读建议:建议结合Simulink仿真模型同步操作,深入理解控制环路设计原理,并可通过调整参数对比不同控制策略的性能差异,进一步拓展至多机并联或复杂微网系统的仿真研究。
内容概要:本文档为乐鑫科技发布的ESP32系列芯片数据手册,详细介绍了ESP32-D0WD-V3、ESP32-U4WDH等型号的技术规格与功能特性。该芯片是一款集成了2.4GHz Wi-Fi和双模蓝牙(Bluetooth/Bluetooth LE)的系统级单芯片(SoC),采用低功耗40nm工艺制造,具备出色的射频性能与稳定性。文档涵盖产品概述、引脚布局、电气特性、功能模块(如CPU架构、内存结构、外设接口)、电源管理、安全机制以及封装信息,适用于多种物联网应用场景。; 适合人群:嵌入式系统工程师、硬件开发者、物联网设备研发人员以及对Wi-Fi/蓝牙集成芯片有应用需求的技术人员。; 使用场景及目标:①用于智能家电、工业自动化、医疗健康、消费电子等领域的无线通信解决方案设计;②支持深度睡眠模式下的超低功耗运行,适用于电池供电设备;③利用丰富的数字和模拟外设(如SPI、I2C、ADC、DAC、PWM等)进行多功能扩展开发;④实现安全启动与Flash加密,保障设备安全性。; 阅读建议:建议结合ESP32硬件设计指南和技术参考手册共同使用,重点关注引脚分配限制、电源配置要求及外设映射关系,确保正确完成电路设计与固件开发。同时注意部分旧型号已不推荐用于新设计(NRND),应优先选用最新版本芯片。
亚马逊官方推出的嵌入式C语言设备端开发套件。它专为资源受限的嵌入式设备接入AWS IoT云平台而设计,提供了一系列经过严格测试和优化的核心库。开发者可利用该SDK快速构建安全、可靠的物联网设备应用,实现设备与AWS云的稳定通信及服务集成。 【核心功能】 - 提供MQTT和HTTP协议客户端,支持与AWS IoT Core进行安全通信 - 集成AWS IoT核心服务:设备影子、设备管理、OTA固件更新和批量设备配置 - 内置安全组件,支持基于证书的相互认证和PKCS#11加密接口 - 包含核心数据处理库:JSON解析、SigV4签名算法和重试退避算法 【适用场景/人群】 该项目特别适合嵌入式软件开发工程师、物联网设备厂商以及希望在资源受限设备上实现AWS IoT连接的学生和研究者。典型应用场景包括智能家居设备、工业传感器、可穿戴设备等需要低功耗、小内存占用的物联网终端。