java 二进制 归属权限_【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】...

一、权限计算相关分析

1.如何存储权限

首先说一下权限保存的问题,一个系统中最多有多少权限呢?一个大的系统中可能有成百上千个权限需要管理。怎么保存这么多的权限?首先,我们使用一个数字中的一位保存一种权限,那么如果现在有3600种权限需要保存,我们就需要一个3600位的数字来保存该权限,首先我们如果不考虑大数的话其它数据类型是没有办法保存这么长的数字的。所以我们为了能够保存这么多的权限,就引入了一个“权限组”的概念,这个权限组只是一个标识权限的容器,我们使用long类型的数字来保存63个权限,假设我们使用long类型的数字来保存权限组,那么很轻松的就能保存住几乎近天文数字个权限。

2.如何保存权限:使用<

如果有一个添加新权限的界面,该怎么添加权限呢?首先,可以给出权限名称和权限指向的url地址以及权限描述,但是不能提供权限位和权限码的编辑,权限位和权限码的计算需要系统自动计算出来。

保存权限的流程图如下:

4d4132b57dcb92920b6ee567c5ecf02d.png

3.如何判断用户是否有指定的权限:使用&运算判断权限

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

5320544534624582c3e23c94b94f9eaf.png

4.如何计算用户的权限总和(rightSum数组)

使用|运算,公式:rightSum[right.pos]=right.pos|rightSum[right.pos];

二、权限实体相关分析

1.为了更加灵活的权限控制,引入角色的概念

角色直接和用户实体挂钩,用户实体不再直接和权限实体关联,而是通过角色实体和权限关联。

一个用户可以有多个角色,一个角色能够属于多个用户;一个角色能够有多个权限,一个权限能够属于多个角色,所以用户和角色之间是多对多的关系,角色和权限之间也是多对多的关系。ER图如下图所示:

345e7789057e1b7b6cfadc05036e99cf.png

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”,那么将会覆盖其余的所有权限,称为最高权限,可以访问一切资源。

1 public class Role implements Serializable{

2 private static final long serialVersionUID = -1585936238538771703L;

3 private Integer roleId; //Role对象标识id

4 private String roleName="未命名角色"; //Role对象名称

5 private String roleValue="0"; //Role对象值,只是在判定是超级管理员的时候有用

6 private String roleDesc="默认角色描述"; //Role对象描述

7 //建立Role到Right之间的单向多多对关系

8 private Setrights=new 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 hql="select 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(topRightPos==null){

13 rightPos=0;

14 rightCodes=1L;

15 }else{

16 if(topRightCodes>=(1L<<60)){

17 rightPos=topRightPos+1;

18 rightCodes=1L;

19 }else{

20 rightPos=topRightPos;

21 rightCodes=topRightCodes<<1;

22 }

23 }

24 right.setRightPos(rightPos);

25 right.setRightCodes(rightCodes);

26 }

27 this.rightDao.saveOrUpdateEntity(right);

28 }

四、显示所有权限,略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB性能测试

因此&#xff0c;今天早上&#xff0c;我在mongo shell中四处乱逛。 我想出了三种不同的方式来聚合所需的数据&#xff0c;但不确定随后应移植哪种代码以在应用程序中使用。 那么&#xff0c;我将如何决定实施哪种方法呢&#xff1f; 好吧&#xff0c;让我们选择性能最佳的产品…

$_SERVER[SCRIPT_NAME]、$_SERVER[PHP_SELF]、$_SERVER[QUERY_STRING]、$_SERVER[REQUEST_URI]

1、$_SERVER["SCRIPT_NAME"] 说明&#xff1a;包含当前脚本的路径 2、$_SERVER["PHP_SELF"] 说明&#xff1a;当前正在执行脚本的文件名 3、$_SERVER["QUERY_STRING"] 说明&#xff1a;查询(query)的字符串 4、$_SERVER["REQUEST_URI"…

yii2增删改查及AR的理解

yii2增删改查 // 返回 id 为 1 的客户 $customer Customer::findOne(1); // 返回 id 为 1 且状态为 *active* 的客户 $customer Customer::findOne([ id > 1, status > Customer::STATUS_ACTIVE, ]); // 返回id为1、2、3的一组客户 $customers Customer::findAll([1, …

GWT和HTML5 Canvas演示

这是我对GWT和HTML5 Canvas的第一个实验。 我的第一个尝试是创建矩形&#xff0c;仅用几行代码就得出了这样的内容&#xff1a; 码&#xff1a; public class GwtHtml5 implements EntryPoint {static final String canvasHolderId "canvasholder";static final St…

mysql 平均值 排序_MySQL按平均两个平均值排序

我正在竞赛网站上工作,有两种类型的用户,普通网站成员和评委.每个人都可以使用拖放工具按照他们选择的顺序对特定比赛中的条目进行排序.完成后,相关的条目ID将附加一个排名值,然后可用于确定比赛中哪个条目获得最高的平均分数.获胜者实际上将通过平均每组的平均值来确定.我希望…

Solr管理界面详解

转载于:https://www.cnblogs.com/gslblog/p/6553813.html

iconv编码转换指令

看到一个不错的指令iconv&#xff0c;可以对文件编码进行转换&#xff0c;记录如下: iconv --list 列出所有支持转换的编码 icon -f code1 -t code2 filename -o newfile -f 即from 原来的编码 -t 即to 新的编码 filename 待转换的文件名 -o newfile 要输出的文件名 转载于:htt…

使用Spring Roo进行快速云开发–第2部分:VMware Cloud Foundry

Spring Roo是在Java平台上提供快速应用程序开发的工具。 我已经解释了何时使用它&#xff1a; http : //www.kai-waehner.de/blog/2011/04/05/when-to-use-spring-roo 。 Spring Roo目前支持两种针对云计算的解决方案&#xff1a;Google App Engine&#xff08;GAE&#xff09;…

java程序日期转换_Java 日期转换详解及实例代码

Java 日期转换涉及的核心类&#xff1a;Date类、SimpleDateFormat类、Calendar类一、 Date型与long型Date型转换为long型Date date new Date();//取得当前时间Date类型long date2long date.getTime();//Date转longlong型转换为Date型long cur System.currentTimeMills();//取…

软件设计之思想

编程用何种语言不重要&#xff0c;重要的是其设计思想。转载于:https://www.cnblogs.com/redfull/p/6554898.html

asp.net 与 java 2017_[ASP.net教程]C#与JAVA学习感悟

[ASP.net教程]C#与JAVA学习感悟0 2015-10-06 23:00:07C#与JAVA学习感悟学完C#与JAVA&#xff0c;感觉收获良多。C#与JAVA这两门语言相似度很高(了解它们早期历史的人可能知道为什么)&#xff0c;也许很多人在学习JAVA(或C#)时会同时学习C#(或JAVA)&#xff0c;因为它们太相似了…

Spring和JSF集成:国际化和本地化

如果您正在开发针对多种语言的JSF应用程序&#xff0c;那么您可能很熟悉<f&#xff1a;loadBundle>标记。 即使您的应用程序不支持使用消息包的国际化仍然是一个好主意。 在<f&#xff1a;loadBundle>标记下&#xff0c;它从Java java.util.ResourceBundle中读取消…

一个实用的却被忽略的命名空间:Microsoft.VisualBasic:

当你看到这个命名空间的时候&#xff0c;别因为是vb的东西就匆忙关掉网页&#xff0c;那将会是您的损失&#xff0c;此命名空间中的资源最初目的是为了简化vb.net开发而创建的&#xff0c;所以microsoft.visualbasic并不属于system命名空间&#xff0c;而是独立存在的。虽然是为…

Linux基础之命令练习Day2-useradd(mod,del),groupadd(mod,del),chmod,chown,

作业一&#xff1a; 1) 新建用户natasha&#xff0c;uid为1000&#xff0c;gid为555&#xff0c;备注信息为“master” 2) 修改natasha用户的家目录为/Natasha 3) 查看用户信息配置文件的最后一行 4) 为natasha用户设置密码“123” 5) 查看用户密码配置文件的最后一行 6) 将nat…

动态表单,JSF世界早已等待

新的PrimeFaces扩展版本0.5.0带来了新的DynaForm组件。 通常&#xff0c;如果知道行/列的数量&#xff0c;元素的位置等&#xff0c;则可以通过h&#xff1a;panelGrid或p&#xff1a;panelGrid来构建非常简单的表单。 对于静态表单&#xff0c;这是正确的。 但是&#xff0c;如…

C# 定时器事件(设置时间间隔,间歇性执行某一函数,控制台程序)

定时器事件代码 static void Main(string[] args) {Method();#region 定时器事件 Timer aTimer new Timer();aTimer.Elapsed new ElapsedEventHandler(TimedEvent);aTimer.Interval seconds * 1000; //配置文件中配置的秒数aTimer.Enabled true;#endregionstring strLi…

总结get和post区别

参考博文&#xff1a;   浅谈HTTP中Get与Post的区别 1. 数据传递方向&#xff1a; Get是向服务器发索取数据的一种请求&#xff0c;Post是向服务器提交数据的一种请求 &#xff08;都是请求&#xff0c;并不是一个取一个发&#xff09; Get&#xff1a;①用于获取信息&#x…

Vmware安装Centos NAT方式设置静态IP

【Vmware中在搭建集群环境等&#xff0c;DHCP自动获取IP方式不方便&#xff0c;为了固定IP减少频繁更改配置信息&#xff0c;建议使用静态IP来配置&#xff0c;网络连接主要有三种方式 1.nat 2.桥接&#xff0c;3主机模式 &#xff0c;在这里主要介NAT方式&#xff0c; 为什么使…

1 TB /节点时快速,可预测且高度可用

世界正每秒从移动设备&#xff0c;Web和各种小工具向应用程序推送大量数据。 如今&#xff0c;更多的应用程序必须处理此数据。 为了保持性能&#xff0c;这些应用程序需要快速访问数据层。 在过去的几年中&#xff0c;RAM价格下降了&#xff0c;我们现在可以便宜得多地获得具有…

java jni 内存_Android开发之JNI内存模型

Java 与JNI 内存管理是怎样的想要弄清楚Java与JNI的内存管理的关系&#xff0c;首先要弄清楚JVM的内存模型JVM内存模型.png其中本地方法栈就是运行时调用native 方法的数据保存区。本地方法栈的大小可以设置成固定的或者是动态扩展。Java中的内存泄露JAVA 编程中的内存泄漏&…