軟件架構(gòu):再說權(quán)限設(shè)計

字號:

我在通用權(quán)限的設(shè)計(上)以及通用權(quán)限的設(shè)計(下)兩文中簡單的介紹了一種權(quán)限設(shè)計的思路。
    為了把做法說清楚,我采用了最簡單的設(shè)計來說明問題,其他涉及到的實際問題,我都沒有詳細說明。并且我在通用權(quán)限的設(shè)計(下)一文中已經(jīng)說了這種方法必然有其適用的范圍,在這里我不妨把這個適用范圍說得清楚一點:首先是權(quán)值的存放,功能點的權(quán)值必須滿足2的n-1次方,也就是說如果我們存放權(quán)值的類型是int類型的話,那么理論上我們這種做法只能適用32個功能點,也就是2的31次方為那個權(quán)值。如果我們采用bigint類型來存放,那么我們理論上可以做64個功能點的,也就是2的63次方為那個權(quán)值。但是如果我們的系統(tǒng)所需要的功能點遠遠不止64個,那是不是就無法采用這種二進制按位與、按位或的做法了?其實答案是否定的,我們不妨把功能點分組,也就是所謂的按模塊劃分,假設(shè)有如下的情況:
    公告模塊
    增加—— 0001 0001
    刪除—— 0001 0010
    修改—— 0001 0100
    查找—— 0001 1000
    新聞模塊
    增加—— 0010 0001
    刪除—— 0010 0010
    修改—— 0010 0100
    查找—— 0010 1000
    我們假設(shè)系統(tǒng)有公告以及新聞兩個模塊,我們用八位二進制碼的前四位來表示所屬的模塊,用后四位來表示模塊下面對應(yīng)的功能點,模塊與功能點又各自滿足2的n-1次方的規(guī)律,也就是有公告模塊的增加操作的功能點是 0001 0001 前四位代表模塊,不同模塊前四位必須滿足2的n-1次方,不能重復(fù),后四位代表對應(yīng)模塊下面的功能點,功能點必須滿足2的n-1次方,但是只要求在模塊內(nèi)不重復(fù)就行。也就是如果有公告的增加操作為 0010 0001,與新聞模塊的增加操作 0001 0001比較可以看出前四位是不同的,并且滿足2的n-1次方,后四位卻是相同的,但是二者總體來看的話卻是代表不同的數(shù),分別為17以及33。
    講到這里你是否已經(jīng)明白怎么回事了?
    如果我們采用這種模塊劃分的做法的話,我們創(chuàng)建角色以及更改角色的時候,只需要把功能點的權(quán)值相加改成功能點的權(quán)值按位或操作即可,即如果角色B具有公告模塊的增加操作與新聞模塊的增加操作的時候就應(yīng)該進行 0001 0001 | 0010 0001 = 0011 0001;其他判斷與操作均與通用權(quán)限的設(shè)計(下)說的一樣。
    那么假如我們用64位來存放權(quán)值,并且前54位我們用來保存模塊,后10位我們來保存模塊對應(yīng)的功能點(實際上大部分模塊的功能點都只是增刪改查4個就夠了),也就是說我們實際上可以支持的功能點總數(shù)就是:54*10=540個,一般系統(tǒng)應(yīng)該夠用了,如果你的系統(tǒng)的模塊較多,模塊對應(yīng)的功能點又較少,我們可以調(diào)整模塊與功能點所占位數(shù)的比例,以此來適用你的系統(tǒng)。