【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】
一、权限计算相关分析
1.如何存储权限
首先说一下权限保存的问题,一个系统中最多有多少权限呢?一个大的系统中可能有成百上千个权限需要管理。怎么保存这么多的权限?首先,我们使用一个数字中的一位保存一种权限,那么如果现在有3600种权限需要保存,我们就需要一个3600位的数字来保存该权限,首先我们如果不考虑大数的话其它数据类型是没有办法保存这么长的数字的。所以我们为了能够保存这么多的权限,就引入了一个“权限组”的概念,这个权限组只是一个标识权限的容器,我们使用long类型的数字来保存63个权限,假设我们使用long类型的数字来保存权限组,那么很轻松的就能保存住几乎近天文数字个权限。
2.如何保存权限:使用<<运算添加权限
如果有一个添加新权限的界面,该怎么添加权限呢?首先,可以给出权限名称和权限指向的url地址以及权限描述,但是不能提供权限位和权限码的编辑,权限位和权限码的计算需要系统自动计算出来。
保存权限的流程图如下:

3.如何判断用户是否有指定的权限:使用&运算判断权限
我们给给权限一个“public”的属性,我们使用该属性标识该资源是否需要有相关权限才能够访问,如果该属性为true,表示该资源是公共资源,不需要任何权限就能访问。每一个权限都唯一的标志了一个url,所谓的是否有权限实际上就是是否有权限访问该url。

4.如何计算用户的权限总和(rightSum数组)
使用|运算,公式:rightSum[right.pos]=right.pos|rightSum[right.pos];
二、权限实体相关分析
1.为了更加灵活的权限控制,引入角色的概念
角色直接和用户实体挂钩,用户实体不再直接和权限实体关联,而是通过角色实体和权限关联。
一个用户可以有多个角色,一个角色能够属于多个用户;一个角色能够有多个权限,一个权限能够属于多个角色,所以用户和角色之间是多对多的关系,角色和权限之间也是多对多的关系。ER图如下图所示:

2.权限实体分析
在权限管理模块,权限实体是不可再分割的最小实体。
(1)首先权限实体需要有一个权限名rightName,名字只是为了方便理解权限的作用;
(2)url,该url实际上是ActionName,如果带有get类型的参数必须将参数拿掉,比如LoginAction_login.action?username=zhangsan&password=lisi,将其处理之后就变成了LoginAction_login.action
(3)权限码rightCodes,一个表中rightCodes并不是唯一的,它只在对应的权限组中唯一,它使用long类型的数据类型进行保存,形式如1,2,4,8,16,....261
为了避免临界值的麻烦,权限码最大为261
(4)权限位,rightPos,也叫做权限组,这里使用一个整数保存即可,用于标识权限位所在的组,虽然只是起到标识作用,但是实际上却是权限码的容器。
(5)是否是公共资源标识common
(6)权限描述,没什么说的,加上即可。
public class Right implements Serializable{
private static final long serialVersionUID = 7690933329658416384L;
private Integer rightId; //权限唯一标识id
private String rightName="未命名"; //权限名称
private String rightUrl; //将要过滤的URL
private String rightDesc="默认描述"; //权限描述
private Long rightCodes; //权限码
private int rightPos; //权限位,实际上就是权限组的类别
private Boolean common=true; //标识是否为公共资源的标识字段
......
}
权限实体和角色实体之间是多对多的关系,需不需要在权限映射文件中建立关联关系?我们从不会根据权限获取该权限属于哪种角色,所以不要建立权限到角色的关联关系,无用的关联只会给系统带来隐藏的负担。
3.角色实体分析
角色实体需要建立到权限实体的多对多关联关系,但是不应该建立到User实体的关联关系,原因同上。另外增加一个roleValue,使用该值标识是否有超级管理员权限。如果该标识为“-1”,那么将会覆盖其余的所有权限,称为最高权限,可以访问一切资源。
public class Role implements Serializable{
private static final long serialVersionUID = -1585936238538771703L;
private Integer roleId; //Role对象标识id
private String roleName="未命名角色"; //Role对象名称
private String roleValue="0"; //Role对象值,只是在判定是超级管理员的时候有用
private String roleDesc="默认角色描述"; //Role对象描述
//建立Role到Right之间的单向多多对关系
private Set<Right>rights=new HashSet<Right>();//这里必须初始化一下,否则在重用保存/修改页的时候会报错
......
}
4.用户实体
只需要增加一个Set集合并建立到角色实体的多对多关系映射即可。
三、增加权限
流程:导航栏上单击“权限管理”超链接跳转到权限管理界面->在权限管理界面上单击“增加权限”超链接->跳转到增加权限页面上->填写表单成功之后,单击提交,交给RightAction_saveOrUpdateRightPage.action处理,期间调用Service方法保存权限->返回权限管理界面。
当然,最核心的还是Service中的方法:
//添加新权限的过程
public void saveOrUpateRight(Right right){
Integer rightPos;
Long rightCodes;
//首先是针对新创建的情况
if(right.getRightId()==null){
//第一步查找最大权限位和最大权限码
String hql="select max(r.rightPos),max(r.rightCodes) from Right r where r.rightPos=(select max(rr.rightPos) from Right rr)";
Object[] arr=(Object[]) this.rightDao.findUniqueResult(hql);
Integer topRightPos=(Integer) arr[0];
Long topRightCodes=(Long) arr[1];
if(topRightPos==null){
rightPos=0;
rightCodes=1L;
}else{
if(topRightCodes>=(1L<<60)){
rightPos=topRightPos+1;
rightCodes=1L;
}else{
rightPos=topRightPos;
rightCodes=topRightCodes<<1;
}
}
right.setRightPos(rightPos);
right.setRightCodes(rightCodes);
}
this.rightDao.saveOrUpdateEntity(right);
}
四、显示所有权限,略。
【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】的更多相关文章
- 【Java EE 学习 74 上】【数据采集系统第六天】【使用Jfreechart的统计图实现】【Jfreechart的基本使用方法】
之前已经实现了数据的采集,现在已经有了基本的数据,下一步就需要使用这些数据实现统计图的绘制了.这里使用Jfreechart实现这些统计图的绘制.首先看一下Jfreechart的基本用法,只有知道了它的 ...
- 【Java EE 学习 80 上】【WebService】
一.WebService概述 什么是WebService,顾名思义,就是基于Web的服务,它使用Http方式接收和响应外部系统的某种请求,从而实现远程调用.WebService实际上就是依据某些标准, ...
- 【Java EE 学习 25 上】【网上图书商城项目实战】
一.概述 1.使用的jdk版本:1.6 2.java EE版本:1.6 3.指导老师:传智播客 王建 二.小项目已经实现的功能 普通用户: 1.登陆 2.注册 3.购物 4.浏览 管理员用户(全部管理 ...
- 【Java EE 学习 78 上】【数据采集系统第十天】【Service使用Spring缓存模块】
一.需求分析 调查问卷中或许每一个单击动作都会引发大量的数据库访问,特别是在参与调查的过程中,只是单击“上一页”或者“下一页”的按钮就会引发大量的查询,必须对这种问题进行优化才行.使用缓存策略进行查询 ...
- 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】
一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...
- 【Java EE 学习 76 上】【数据采集系统第八天】【角色授权】【用户授权】【权限的粗粒度控制】【权限的细粒度控制】
一.角色管理 单击导航栏上的"角色管理"超链接,跳转到角色管理界面,在该界面上显示所有角色,并提供角色的增加和删除.修改超链接. 1.增加新角色(角色授权) 流程:单击增加新角色超 ...
- 【Java EE 学习 72 上】【数据采集系统第四天】【增加调查logo】【文件上传】【动态错误页指定】【上传限制】【国际化】
增加logo的技术点:文件上传,国际化 文件上传的功能在struts2中是使用文件上传拦截器完成的. 1.首先需要在页面上添加一个文件上传的超链接. 点击该超链接能够跳转到文件上传页面.我给该表单页面 ...
- 【Java EE 学习 75 下】【数据采集系统第七天】【二进制运算实现权限管理】【使用反射初始化权限表】【权限捕获拦截器动态添加权限】
一.使用反射动态添加权限 在该系统中,我使用struts2的时候非常规范,访问的Action的形式都是"ActionClassName_MethodName.action?参数列表" ...
- 【Java EE 学习 71 上】【数据采集系统第三天】【增加页面】【增加问题】【编辑页面,编辑问题】
增加页面和编辑页面.增加问题和编辑问题的页面使用的都是相同的页面,最后调用的方法是saveOrUpdate方法,所以只说一个就可以了. 一.增加页面 比较简单,略.流程如下: 单击“增加页”超链接-& ...
随机推荐
- Oracle数据库to_date()和to_char()的相关
select * from T_A a where a.begintime=to_date('2013-1-1','yyyy-mm-dd');和select * from T_A a where to ...
- iOS and JAVA 的 RSA 加密解密 (转载整理 )
参考原文地址:http://www.cnblogs.com/makemelike/articles/3802518.html (至于RSA的基本原理,大家可以看 阮一峰的网络日志 的 RSA算法原理( ...
- coreseek+sphinx+mysql+thinkphp整合
1.安装coreseek 1.1首先升级或安装系统依赖库 yum install make gcc g++ automake libtool mysql-client libmysqlclient15 ...
- CMakeLists.txt
vtkRendering.libvtkCommon.lib ${VTK_LIBRARIES} vtkRendering vtkCommon
- JS-时间函数
/** * 日期范围工具类 */ var dateRangeUtil = (function () { /*** * 获得当前时间 */ this.getCurrentDate = function ...
- STM32f10xxx 之 GPIO口配置
背景 配置stm32f103使其完成PWM输出的过程中,在配置GPIO口的时候,按照习惯配置GPIO口的speed为50MHZ,突然就意识到,为什么大部分例程习惯配置为50MHZ,而不是其它值,即有了 ...
- android 弹出AlertDialog的学习案例
我在编写的时候,测试的关键代码: AlertDialog.Builder builder=new AlertDialog.Builder(MainPointListActivity.this); bu ...
- int与CString互相转化
int num; CString str; //int转CString num=; str.Format(_T("%d"),num); //CString转int str=L&qu ...
- angularJS绑定数据时自动转义html标签
angularJS在进行数据绑定时默认是会以文本的形式输出,也就是对你数据中的html标签不进行转义照单全收,这样提高了安全性,防止了html标签中的注入攻击,但有些时候还是需要的,特别是从数据库读取 ...
- 我的js函数库(持续更新)
常用js初始化函数 function id(obj) { return document.getElementById(obj); } function bind(obj, ev, fn) { if ...