上海专业做网站服务商,台州企业免费建站,网站建设项目实训心得,wordpress折叠插件一、权限计算相关分析1.如何存储权限首先说一下权限保存的问题#xff0c;一个系统中最多有多少权限呢#xff1f;一个大的系统中可能有成百上千个权限需要管理。怎么保存这么多的权限#xff1f;首先#xff0c;我们使用一个数字中的一位保存一种权限#xff0c;那么如果…一、权限计算相关分析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?usernamezhangsanpasswordlisi将其处理之后就变成了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; //权限唯一标识idprivate String rightName未命名; //权限名称private String rightUrl; //将要过滤的URLprivate String rightDesc默认描述; //权限描述private Long rightCodes; //权限码private int rightPos; //权限位实际上就是权限组的类别private Boolean commontrue; //标识是否为公共资源的标识字段......}权限实体和角色实体之间是多对多的关系需不需要在权限映射文件中建立关联关系我们从不会根据权限获取该权限属于哪种角色所以不要建立权限到角色的关联关系无用的关联只会给系统带来隐藏的负担。3.角色实体分析角色实体需要建立到权限实体的多对多关联关系但是不应该建立到User实体的关联关系原因同上。另外增加一个roleValue使用该值标识是否有超级管理员权限。如果该标识为“-1”那么将会覆盖其余的所有权限称为最高权限可以访问一切资源。1 public class Role implements Serializable{2 private static final long serialVersionUID -1585936238538771703L;3 private Integer roleId; //Role对象标识id4 private String roleName未命名角色; //Role对象名称5 private String roleValue0; //Role对象值只是在判定是超级管理员的时候有用6 private String roleDesc默认角色描述; //Role对象描述7 //建立Role到Right之间的单向多多对关系8 private Setrightsnew HashSet();//这里必须初始化一下否则在重用保存/修改页的时候会报错9 ......10 }4.用户实体只需要增加一个Set集合并建立到角色实体的多对多关系映射即可。三、增加权限流程导航栏上单击“权限管理”超链接跳转到权限管理界面-在权限管理界面上单击“增加权限”超链接-跳转到增加权限页面上-填写表单成功之后单击提交交给RightAction_saveOrUpdateRightPage.action处理期间调用Service方法保存权限-返回权限管理界面。当然最核心的还是Service中的方法1 //添加新权限的过程2 public void saveOrUpateRight(Right right){3 Integer rightPos;4 Long rightCodes;5 //首先是针对新创建的情况6 if(right.getRightId()null){7 //第一步查找最大权限位和最大权限码8 String hqlselect max(r.rightPos),max(r.rightCodes) from Right r where r.rightPos(select max(rr.rightPos) from Right rr);9 Object[] arr(Object[]) this.rightDao.findUniqueResult(hql);10 Integer topRightPos(Integer) arr[0];11 Long topRightCodes(Long) arr[1];12 if(topRightPosnull){13 rightPos0;14 rightCodes1L;15 }else{16 if(topRightCodes(1L60)){17 rightPostopRightPos1;18 rightCodes1L;19 }else{20 rightPostopRightPos;21 rightCodestopRightCodes1;22 }23 }24 right.setRightPos(rightPos);25 right.setRightCodes(rightCodes);26 }27 this.rightDao.saveOrUpdateEntity(right);28 }四、显示所有权限略。