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.pswp.cn/news/372693.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372693.shtml
英文地址,請注明出處:http://en.pswp.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 編程中的內存泄漏&…