`
hsbljyy
  • 浏览: 5278 次
  • 性别: Icon_minigender_1
  • 来自: 福州
最近访客 更多访客>>
社区版块
存档分类
最新评论

老生长谈:B/S权限设计(基于Struts 2.*)

阅读更多

这是个老话题了,随便GOOGLE或者百度都可以找到一大堆。现在的权限控制基本上都是基于RBAC的,在这里我是基于RBAC与Struts2.*,可能还有些没有完善的地方,提出来与大家讨论一下。

 

我们知道,权限一般分为操作权限跟数据权限,这里讨论的只是操作权限。其实与其说是讨论,倒不如说是讨教,因为我这边已经有几个方案(主要是持久化这部分),但是一直拿捏不定。

 

第一种方案:

1.跟大多数的设计一样,分为用户、角色、资源、权限、模块。其中:资源代表的是Struts 2.*中的Action类,权限则是每个Action中的操作方法。例如,PassportAction有这么几个方法:login、logout、regist。PassportAction就是一个资源,而login、logout、regist则代表一个个权限。同时,权限还有一个属性表示是否为默认权限,以减少权限的配置。

 

2.模块则是与页面相关的资源,比方说系统有一个销售管理的模块,在程序中可能是webapp/${工程名}/application/sale/SaleManage.jsp的页面。在这里,我将模块设计成树形结构,也就是由上下级关系。用户登录后,系统将根据用户持有的模块信息,将所有的模块显示出来。

 

3.角色则是一组权限跟一组模块的组合。

 

4.用户则可以同时持有多组角色。

 

然后是权限验证,因为采用的Struts2.*,可以使用拦截器的方式来实现。大概的思路是这样的,拦截器可以很容易就获取每次请求调用的Action信息,可以根据这些信息从数据库找到相应的资源(当然你也可以做Application级别的缓存)和方法信息。这样就可以得到一个判断结果。至于模块的设计是为了在用户登录系统时可以直接输出模块信息(模块树)。

 

然后是持久层的设计,在这种方案中我采取的是数据库来保存数据。分别为T_Resource、T_Privilege、T_Module、T_Role、T_Role_Privilege_Link、T_Role_Module_Link、T_User_Role_Link。

 

Java类的设计就不说,相信大家能做得比我更好。

 

第二种方案:

设计思想跟第一种方案差不多。只是Resource不再独立成一个类,Privilege则变成一个Url,其中包含两个属性:NameSpace跟ActionName。同时,Privilege不在独立存储,即根据每次请求的Action与method组合而成。至于Role,用xml方式来存储。一种角色用一个Xml存储,xml文件名则是角色名称。

 

比方说Sale.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Role PUBLIC "Role" "role.dtd" >
<Role>
	<PrivilegeSet>
		<Privilege>/login</Privilege>
		<Privilege></Privilege>
	</PrivilegeSet>
	<ModuleSet>
		<Module></Module>
	</ModuleSet>
</Role>

 这样我就可以再系统启动的时候便解析这些角色配置文件,然后将角色实例缓存下来(当然,缓存下来的可不仅仅只是角色,还有权限跟模块),然后以角色名(如Sale)为key查找,权限、模块的缓存也相似。

 

这种方式的一个好处就是,配置完Struts以后权限也配置完成,权限部分不容易出错,而且容易备份,但是一般角色超过某个数量的时候,维护起来相当麻烦,而且要保证Struts的配置文件信息不能轻易变动(虽然在生产型系统中变动的可能性不会很大),还有个缺点就是不方便以可视化的方式进行管理。

分享到:
评论
21 楼 niuky 2010-04-29  
我也正在做通用的权限管理系统,模块我觉得就没必要了,在权限里面直接体现了。。。。
20 楼 吃猫的老鼠 2009-09-22  
对最好不要放在XML里面 不好动态的修改  而且大部分系统存在 用户组权限不同的问题。
19 楼 吃猫的老鼠 2009-09-22  
我谈下一般项目具体用的吧:
一般会在每个转接处理那里加载个ACL的TAG
然后根据TAG的FUNCTION号码在数据库进行分组管理
简单的可以存储在LDAP同事
很复杂,访问量大的系统会使用专门的访问控制软件如 IBM的Tivoli Acess Manager
18 楼 hsbljyy 2009-09-22  
jun_fx 写道
hsbljyy 写道
keer2345 写道
好复杂啊,权限设计的确是牵涉太广了


这个还好吧,还没涉及数据权限。

哎,还是经验有限,光一个操作权限的设计就让我如此纠结~郁闷哪!!!


请问下生产环境中。你的角色、模块是可以随时动态分配?


如果按第一种方案是可以,第二种方案因为要涉及xml文件的操作,这个我想还是可以做得到,只是相对来说比较麻烦。
17 楼 jun_fx 2009-09-21  
hsbljyy 写道
keer2345 写道
好复杂啊,权限设计的确是牵涉太广了


这个还好吧,还没涉及数据权限。

哎,还是经验有限,光一个操作权限的设计就让我如此纠结~郁闷哪!!!


请问下生产环境中。你的角色、模块是可以随时动态分配?
16 楼 hsbljyy 2009-09-21  
keer2345 写道
好复杂啊,权限设计的确是牵涉太广了


这个还好吧,还没涉及数据权限。

哎,还是经验有限,光一个操作权限的设计就让我如此纠结~郁闷哪!!!
15 楼 keer2345 2009-09-21  
好复杂啊,权限设计的确是牵涉太广了
14 楼 hsbljyy 2009-09-21  
shuaijie506 写道
建议不使用XML文件存在,放数据库里查询方便,在XML里就比较麻烦了,例如,你要列举出某个资源都有哪些角色甚至哪些用户有对应的权限时,你就傻眼了。


是啊,对于你说的这种情况我有考虑过,要做到也不是不可能,只是相对来说,程序的复杂度就提高了,得不偿失而已。

其实就是一个抉择。
13 楼 hsbljyy 2009-09-21  
曾经de迷茫 写道
nbaertuo 写道
测试是否可以灌水!


难道真的可以灌水了?

权限有没有开源的组件可以直接用啊?


好像spring有一个权限框架叫:acegi

只是我没研究过,不知道好不好用,不过貌似还是有蛮多人推荐的,可以尝试一下。

12 楼 曾经de迷茫 2009-09-21  
nbaertuo 写道
测试是否可以灌水!


难道真的可以灌水了?

权限有没有开源的组件可以直接用啊?
11 楼 gstarwd 2009-09-20  
正在学struts。
10 楼 hsbljyy 2009-09-18  
icefire 写道
shuaijie506 写道
建议不使用XML文件存在,放数据库里查询方便,在XML里就比较麻烦了,例如,你要列举出某个资源都有哪些角色甚至哪些用户有对应的权限时,你就傻眼了。


可以两者配合着用,启动时把XML导入到数据库中,毕竟在开发时,一些配置写在XML里,比在数据库中来配置要方便。

有考虑过这种方案,可是难道每次重启服务都要把表删除,然后重建?
9 楼 nbaertuo 2009-09-18  
测试是否可以灌水!
8 楼 icefire 2009-09-18  
shuaijie506 写道
建议不使用XML文件存在,放数据库里查询方便,在XML里就比较麻烦了,例如,你要列举出某个资源都有哪些角色甚至哪些用户有对应的权限时,你就傻眼了。


可以两者配合着用,启动时把XML导入到数据库中,毕竟在开发时,一些配置写在XML里,比在数据库中来配置要方便。
7 楼 寄生虫 2009-09-18  
我把权限分两种:
1.操作权限
2.数据权限

操作权限UI化——与UI组件结合
数据权限灵活化——不用上下级关系来确定数据权限
6 楼 shuaijie506 2009-09-18  
建议不使用XML文件存在,放数据库里查询方便,在XML里就比较麻烦了,例如,你要列举出某个资源都有哪些角色甚至哪些用户有对应的权限时,你就傻眼了。
5 楼 hsbljyy 2009-09-11  
阳光晒晒 写道
xml权限啊....那是在java分工中还含有
布署工程师这个职业时老皇历了....


是呀,所以我才犹豫啊!

只是如果这样结合Struts,至少资源跟权限部分的配置信息我就可以省略掉了。
4 楼 阳光晒晒 2009-09-11  
xml权限啊....那是在java分工中还含有
布署工程师这个职业时老皇历了....
3 楼 hsbljyy 2009-09-11  
seekgirl 写道
用户、角色、资源、权限、模块
不知道为何多出一个模块来

模块的加入是为了对应系统各个模块菜单,可以粗粒度地对用户可访问资源进行控制。比方说如果系统存在客户管理、销售管理、财务管理,如果一个角色没有访问财务管理模块的权限。那么只要不将该模块配给该角色,那么它在界面上就不会显示该模块菜单。
2 楼 seekgirl 2009-09-11  
用户、角色、资源、权限、模块
不知道为何多出一个模块来

相关推荐

    【老生谈算法】matlab实现跳频通信系统设计.doc

    【老生谈算法】matlab实现跳频通信系统设计 跳频通信系统是无线通信领域中一种抗干扰能力强、安全性高的通信方式。该系统的工作原理是利用伪随机变化码来控制信号载波频率的随机跳变,使得通信过程中载波频率按照...

    MATLAB GUI实用源码1:简单的文本框数据传递

    【达摩老生出品,必属精品,亲测校正,质量保证】 资源名:MATLAB GUI实用源码1:简单的文本框数据传递 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不...

    【老生谈算法】matlab实现车牌识别设计.doc

    【车牌识别MATLAB实现】是计算机视觉和模式识别技术在...总的来说,基于MATLAB的车牌识别设计涵盖了图像处理、模式识别和计算机视觉等多个领域的理论和技术,是智能交通系统中的关键技术,具有广阔的研究和应用前景。

    大学校园跳蚤市场策划2022年[扫描版].pdf

    此外,活动背景指出,随着学年的更迭,新生和老生的需求变化,跳蚤市场能够解决物品过剩与需求的问题,提供一个互动交流的平台。活动旨在培养学生的节约意识,同时也为校园文化增添活力。通过这样的活动,学生可以...

    【老生谈算法】基于遗传算法的机器人路径规划MATLAB源代码.docx

    ### 基于遗传算法的机器人路径规划MATLAB实现 #### 概述 本文档介绍了一个结合了Dijkstra算法与遗传算法的机器人路径规划方法,并提供了MATLAB源代码。该方法首先利用Dijkstra算法找到一个从起点到终点的可行路径...

    学校管理各类表格.doc

    1. **板书规范书写成绩考核表**:评估教师在黑板上的书写规范,包括标准板面设计、字体格式、内容贴合度和色彩运用,以提高教学质量。 2. **少儿歌曲表演课成绩考核表**:衡量教师在教授儿童歌曲时的表演技巧和教学...

    维也纳大学的LTE链路级仿真平台,实现了LTE两路及仿真的整过程_matlab

    【达摩老生出品,必属精品,亲测校正,质量保证】 资源名:维也纳大学的LTE链路级仿真平台,实现了LTE两路及仿真的整过程_matlab 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功...

    学生公寓管理系统

    学生公寓管理系统通常采用B/S(Browser/Server)架构,即浏览器/服务器模式。用户通过浏览器进行操作,服务器端负责处理请求、存储数据和响应信息。这种架构使得系统具有良好的跨平台性和易用性,无需在客户端安装...

    【老生谈算法】matlab实现基于粒子群算法的PID控制器优化设计.doc

    【老生谈算法】matlab实现基于粒子群算法的PID控制器优化设计主要涉及以下几个关键知识点: 1. **PID控制器**:PID(比例-积分-微分)控制器是一种广泛应用的反馈控制算法,通过调整三个参数Kp(比例系数)、Ki...

    幼儿园安全工作制度-14页.pdf

    2. **老生回访**:每年至少一次,交流幼儿表现。 3. **长期缺席**:及时上门了解幼儿情况。 4. **师德规范**:家访时体现教师的专业形象。 【家长委员会制度】 家长委员会是家长参与幼儿园管理的平台: 1. **成员...

    【老生谈算法】卡尔曼滤波算法及MATLAB实现.docx

    通过对语音信号的分帧处理、噪声协方差估计以及卡尔曼滤波器的设计与实现,能够有效提高语音信号的质量。通过MATLAB平台实现卡尔曼滤波不仅便于理解和调试,也为进一步的研究提供了坚实的基础。

    vb毕业生管理系统设计(论文+源代码).zip

    【VB毕业设计:毕业生管理系统】 本项目是一个基于Visual Basic(VB)开发的毕业生管理系统,它涵盖了学生信息管理、成绩管理、就业信息管理等多个模块,旨在为高校提供一个方便、高效的学生信息处理平台。通过这个...

    大学迎新活动方案5篇.docx

    4. **活动地点**:包括新生报到处(B号楼门口、B215、H楼建筑大厅、宿舍)。 5. **策划与执行单位**:信息工程系团委、青年志愿者协会,合作赞助商。 6. **参与人员**:信息工程系青年志愿者。 7. **活动对象**:...

    【老生谈算法】单纯形法Matlab程序.docx

    【老生谈算法】单纯形法Matlab程序 在优化问题中,单纯形法是一种解决线性规划问题的常用算法。线性规划是寻找线性函数的最大值或最小值,同时满足一系列线性等式和不等式约束。单纯形法通过迭代方式,逐步将非基...

    【老生谈算法】基于matlab的fir滤波器的设计.doc

    【老生谈算法】基于matlab的fir滤波器设计主要涵盖了数字信号处理中的关键步骤,包括信号的读取、频谱分析、噪声信号的构建、滤波器的设计与应用。以下将详细阐述这些知识点: 1. **信号的读取**: 在MATLAB中,`...

    【老生谈算法】matlab实现基于蚁群算法的机器人路径规划.docx

    【老生谈算法】matlab实现基于蚁群算法的机器人路径规划 在本文档中,我们探讨了如何使用MATLAB实现一种基于蚁群算法(Ant Colony Optimization, ACO)的机器人路径规划方法。蚁群算法是一种模拟自然界中蚂蚁寻找...

    【老生谈算法】matlab实现人脸识别系统设计与仿真.doc

    【老生谈算法】matlab实现人脸识别系统设计与仿真是一个深入探讨如何在MATLAB环境中构建和模拟人脸识别系统的文档。该文档旨在详细解释算法的原理,并提供了MATLAB源代码供学习者参考。以下是对该主题的详细阐述: ...

    【老生谈算法】matlab实现信噪比估计算法程序.doc

    7. **归一化均方误差(Normalized Mean Square Error, NMSE)**:NMSE是评估估计值与真实值之间偏差的标准度量,通过`pe(i)=sum1./(rho(i).^2)/Nt/K`计算得出。 8. **仿真**:整个MATLAB程序是为了进行多次仿真以...

    【老生谈算法】遗传算法优化相关MATLAB算法实现.docx

    ##### 例2:多元函数优化 该例子通过遗传算法求解函数\(f(x,y) = y\sin(2\pi x) + x\cos(2\pi y)\)在区间\([-2,2]\)内的最小值。 1. **设置参数**:个体数目\(NIND=40\);最大遗传代数\(MAXGEN=50\);变量的二进制...

    【老生谈算法】matlab实现基于蚁群算法的二维路径规划算法.doc

    《老生谈算法:MATLAB实现基于蚁群算法的二维路径规划》 路径规划算法是计算机科学和机器人学中的一个重要领域,特别是在有障碍物的环境中寻找最优路径。本文将深入探讨一种利用MATLAB实现的二维路径规划算法——...

Global site tag (gtag.js) - Google Analytics