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,一经查实,立即删除!

相关文章

GWT和HTML5 Canvas演示

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

Solr管理界面详解

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

一个实用的却被忽略的命名空间: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…

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 编程中的内存泄漏&…

04 linux用户群组和权限

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

基于 CoreText 实现的高性能 UITableView

引起UITableView卡顿比较常见的原因有cell的层级过多、cell中有触发离屏渲染的代码&#xff08;譬如&#xff1a;cornerRadius、maskToBounds 同时使用&#xff09;、像素是否对齐、是否使用UITableView自动计算cell高度的方法等。本文将从cell层级出发&#xff0c;以一个仿朋友…

Web Magic 总体架构

1.2 总体架构 WebMagic的结构分为Downloader、PageProcessor、Scheduler、Pipeline四大组件&#xff0c;并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能。WebMagic的设计参考了Scapy&#xff0c;但是实现方式更Java化一些。 而S…

SpringMVC搭建+实例

想做一点自己喜欢的东西&#xff0c;研究了一下springMVC,所以就自己搭建一个小demo,可供大家吐槽。 先建一个WEB工程&#xff0c;这个相信大家都会&#xff0c;这里不在多说。去网上下载spring jar包&#xff0c;然后在WEB-INF下新建一个lib文件&#xff0c;将下载的jar包放进…

php8更新,PHP 8 中新特性以及重大调整

PHP 8&#xff0c;PHP 的一个新的大版本&#xff0c;预计将于2020年12月3日发布&#xff0c;这意味着将不会有 PHP 7.5 版本。PHP8目前正处于非常活跃的开发阶段&#xff0c;所以在接下来的几个月里&#xff0c;情况可能会发生很大的变化。在这篇文章中&#xff0c;我会维持一个…

Javascript学习之函数(function)

http://www.cnblogs.com/royalroads/p/4418587.html 在JS中,Function(函数)类型实际上是对象;每个函数都是Function类型的实例&#xff0c;而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针。 一 函数的声明方式 //1.函数声…

用于Spring JPA2后端的REST CXF

在本演示中&#xff0c;我们将使用spring / jpa2后端生成一个REST / CXF应用程序。 该演示演示了分钟项目的轨迹REST-CXF 。 演示2中的模型保持不变。 浓缩保持不变。 但是轨道改变了 添加的是2层&#xff1a; 在JPA2之上具有弹簧集成的DAO层 具有JAX-RS批注的REST-CXF层…

完整的WebApplication JSF EJB JPA JAAS –第1部分

这篇文章将是迄今为止我博客中最大的一篇文章&#xff01; 我们将看到完整的Web应用程序。 最新的技术将完成此工作&#xff08;直到今天&#xff09;&#xff0c;但是我将给出一些提示以显示如何使本文适用于较旧的技术。 在本文的结尾&#xff0c;您将找到要下载的源代码。 您…

使用Hibernate加载或保存图像-MySQL

本教程将引导您逐步了解如何使用Hibernate从数据库&#xff08; MySQL &#xff09;保存和加载图像。 要求 对于此示例项目&#xff0c;我们将使用&#xff1a; Eclipse IDE &#xff08;您可以使用自己喜欢的IDE&#xff09;&#xff1b; MySQL &#xff08;您可以使用任何…

javaweb回顾第四篇Servlet异常处理

前言&#xff1a;很多网站为了给用户很好的用户体验性&#xff0c;都会提供比较友好的异常界面&#xff0c;现在我们在来回顾一下Servlet中如何进行异常处理的。 1&#xff1a;声明式异常处理 什么是声明式&#xff1a;就是在web.xml中声明对各种异常的处理方法。 是通过<er…

java开发cs教程,日常运维(一)

w命令&#xff1a;用于查看系统负载、显示已经登陆系统的用户列表&#xff0c;并显示用户正在执行的指令等信息第一行从左面开始显示的信息依次为&#xff1a;时间&#xff0c;系统运行时间&#xff0c;登录用户数&#xff0c;平均负载。第二行开始以及下面所有的行&#xff0c…