java 二进制 归属权限_【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】...
一、權(quán)限計(jì)算相關(guān)分析
1.如何存儲(chǔ)權(quán)限
首先說(shuō)一下權(quán)限保存的問(wèn)題,一個(gè)系統(tǒng)中最多有多少權(quán)限呢?一個(gè)大的系統(tǒng)中可能有成百上千個(gè)權(quán)限需要管理。怎么保存這么多的權(quán)限?首先,我們使用一個(gè)數(shù)字中的一位保存一種權(quán)限,那么如果現(xiàn)在有3600種權(quán)限需要保存,我們就需要一個(gè)3600位的數(shù)字來(lái)保存該權(quán)限,首先我們?nèi)绻豢紤]大數(shù)的話其它數(shù)據(jù)類型是沒(méi)有辦法保存這么長(zhǎng)的數(shù)字的。所以我們?yōu)榱四軌虮4孢@么多的權(quán)限,就引入了一個(gè)“權(quán)限組”的概念,這個(gè)權(quán)限組只是一個(gè)標(biāo)識(shí)權(quán)限的容器,我們使用long類型的數(shù)字來(lái)保存63個(gè)權(quán)限,假設(shè)我們使用long類型的數(shù)字來(lái)保存權(quán)限組,那么很輕松的就能保存住幾乎近天文數(shù)字個(gè)權(quán)限。
2.如何保存權(quán)限:使用<
如果有一個(gè)添加新權(quán)限的界面,該怎么添加權(quán)限呢?首先,可以給出權(quán)限名稱和權(quán)限指向的url地址以及權(quán)限描述,但是不能提供權(quán)限位和權(quán)限碼的編輯,權(quán)限位和權(quán)限碼的計(jì)算需要系統(tǒng)自動(dòng)計(jì)算出來(lái)。
保存權(quán)限的流程圖如下:
3.如何判斷用戶是否有指定的權(quán)限:使用&運(yùn)算判斷權(quán)限
我們給給權(quán)限一個(gè)“public”的屬性,我們使用該屬性標(biāo)識(shí)該資源是否需要有相關(guān)權(quán)限才能夠訪問(wèn),如果該屬性為true,表示該資源是公共資源,不需要任何權(quán)限就能訪問(wèn)。每一個(gè)權(quán)限都唯一的標(biāo)志了一個(gè)url,所謂的是否有權(quán)限實(shí)際上就是是否有權(quán)限訪問(wèn)該url。
4.如何計(jì)算用戶的權(quán)限總和(rightSum數(shù)組)
使用|運(yùn)算,公式:rightSum[right.pos]=right.pos|rightSum[right.pos];
二、權(quán)限實(shí)體相關(guān)分析
1.為了更加靈活的權(quán)限控制,引入角色的概念
角色直接和用戶實(shí)體掛鉤,用戶實(shí)體不再直接和權(quán)限實(shí)體關(guān)聯(lián),而是通過(guò)角色實(shí)體和權(quán)限關(guān)聯(lián)。
一個(gè)用戶可以有多個(gè)角色,一個(gè)角色能夠?qū)儆诙鄠€(gè)用戶;一個(gè)角色能夠有多個(gè)權(quán)限,一個(gè)權(quán)限能夠?qū)儆诙鄠€(gè)角色,所以用戶和角色之間是多對(duì)多的關(guān)系,角色和權(quán)限之間也是多對(duì)多的關(guān)系。ER圖如下圖所示:
2.權(quán)限實(shí)體分析
在權(quán)限管理模塊,權(quán)限實(shí)體是不可再分割的最小實(shí)體。
(1)首先權(quán)限實(shí)體需要有一個(gè)權(quán)限名rightName,名字只是為了方便理解權(quán)限的作用;
(2)url,該url實(shí)際上是ActionName,如果帶有g(shù)et類型的參數(shù)必須將參數(shù)拿掉,比如LoginAction_login.action?username=zhangsan&password=lisi,將其處理之后就變成了LoginAction_login.action
(3)權(quán)限碼rightCodes,一個(gè)表中rightCodes并不是唯一的,它只在對(duì)應(yīng)的權(quán)限組中唯一,它使用long類型的數(shù)據(jù)類型進(jìn)行保存,形式如1,2,4,8,16,....261
為了避免臨界值的麻煩,權(quán)限碼最大為261
(4)權(quán)限位,rightPos,也叫做權(quán)限組,這里使用一個(gè)整數(shù)保存即可,用于標(biāo)識(shí)權(quán)限位所在的組,雖然只是起到標(biāo)識(shí)作用,但是實(shí)際上卻是權(quán)限碼的容器。
(5)是否是公共資源標(biāo)識(shí)common
(6)權(quán)限描述,沒(méi)什么說(shuō)的,加上即可。
public class Right implements Serializable{
private static final long serialVersionUID = 7690933329658416384L;
private Integer rightId; //權(quán)限唯一標(biāo)識(shí)id
private String rightName="未命名"; //權(quán)限名稱
private String rightUrl; //將要過(guò)濾的URL
private String rightDesc="默認(rèn)描述"; //權(quán)限描述
private Long rightCodes; //權(quán)限碼
private int rightPos; //權(quán)限位,實(shí)際上就是權(quán)限組的類別
private Boolean common=true; //標(biāo)識(shí)是否為公共資源的標(biāo)識(shí)字段
......
}
權(quán)限實(shí)體和角色實(shí)體之間是多對(duì)多的關(guān)系,需不需要在權(quán)限映射文件中建立關(guān)聯(lián)關(guān)系?我們從不會(huì)根據(jù)權(quán)限獲取該權(quán)限屬于哪種角色,所以不要建立權(quán)限到角色的關(guān)聯(lián)關(guān)系,無(wú)用的關(guān)聯(lián)只會(huì)給系統(tǒng)帶來(lái)隱藏的負(fù)擔(dān)。
3.角色實(shí)體分析
角色實(shí)體需要建立到權(quán)限實(shí)體的多對(duì)多關(guān)聯(lián)關(guān)系,但是不應(yīng)該建立到User實(shí)體的關(guān)聯(lián)關(guān)系,原因同上。另外增加一個(gè)roleValue,使用該值標(biāo)識(shí)是否有超級(jí)管理員權(quán)限。如果該標(biāo)識(shí)為“-1”,那么將會(huì)覆蓋其余的所有權(quán)限,稱為最高權(quán)限,可以訪問(wèn)一切資源。
1 public class Role implements Serializable{
2 private static final long serialVersionUID = -1585936238538771703L;
3 private Integer roleId; //Role對(duì)象標(biāo)識(shí)id
4 private String roleName="未命名角色"; //Role對(duì)象名稱
5 private String roleValue="0"; //Role對(duì)象值,只是在判定是超級(jí)管理員的時(shí)候有用
6 private String roleDesc="默認(rèn)角色描述"; //Role對(duì)象描述
7 //建立Role到Right之間的單向多多對(duì)關(guān)系
8 private Setrights=new HashSet();//這里必須初始化一下,否則在重用保存/修改頁(yè)的時(shí)候會(huì)報(bào)錯(cuò)
9 ......
10 }
4.用戶實(shí)體
只需要增加一個(gè)Set集合并建立到角色實(shí)體的多對(duì)多關(guān)系映射即可。
三、增加權(quán)限
流程:導(dǎo)航欄上單擊“權(quán)限管理”超鏈接跳轉(zhuǎn)到權(quán)限管理界面->在權(quán)限管理界面上單擊“增加權(quán)限”超鏈接->跳轉(zhuǎn)到增加權(quán)限頁(yè)面上->填寫表單成功之后,單擊提交,交給RightAction_saveOrUpdateRightPage.action處理,期間調(diào)用Service方法保存權(quán)限->返回權(quán)限管理界面。
當(dāng)然,最核心的還是Service中的方法:
1 //添加新權(quán)限的過(guò)程
2 public void saveOrUpateRight(Right right){
3 Integer rightPos;
4 Long rightCodes;
5 //首先是針對(duì)新創(chuàng)建的情況
6 if(right.getRightId()==null){
7 //第一步查找最大權(quán)限位和最大權(quán)限碼
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 }
四、顯示所有權(quán)限,略。
總結(jié)
以上是生活随笔為你收集整理的java 二进制 归属权限_【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java web开发技术大_2021年六
- 下一篇: android+4.4+稳定性,新系统新