權(quán)限設(shè)計(jì)是很多系統(tǒng)重要的組成部分,主要用于控制功能和流程,本文將幾種常見的權(quán)限設(shè)計(jì)方案(權(quán)限系統(tǒng)的名都是自己起的)的基本設(shè)計(jì)寫出來(lái),其中不恰當(dāng)處還請(qǐng)大家指出,我們來(lái)討論一下.
1.等級(jí)權(quán)限系統(tǒng)
這種權(quán)限系統(tǒng)在論壇中很常見,在這種系統(tǒng)中,權(quán)限級(jí)別如同官階從低到高排列,每個(gè)用戶擁有一個(gè)權(quán)限,其中設(shè)定了這個(gè)用戶的權(quán)限等級(jí),在用戶需要執(zhí)行操作前先查看其權(quán)限等級(jí)是否大于執(zhí)行操作所需要的權(quán)限等級(jí),是則進(jìn)行操作。
在等級(jí)權(quán)限系統(tǒng)中領(lǐng)域?qū)ο笥脩纛怳ser的基本屬性如下:
id // 用戶ID
name // 用戶名
領(lǐng)域?qū)ο髾?quán)限類Privilege的基本屬性如下:
id // 權(quán)限ID
userid // 持有此權(quán)限的用戶id
level // 用戶的權(quán)限等級(jí)
level的設(shè)置示例
level 對(duì)應(yīng)可執(zhí)行的功能
0 訪問(wèn)
1 可跟帖
2 可創(chuàng)建主貼
3 可刪除主貼
4 可創(chuàng)建頻道
5 可刪除頻道
6 可查看用戶
7 可分配用戶權(quán)限
8 可修改用戶密碼
9 可刪除用戶
...
使用中,執(zhí)行一個(gè)操作比如創(chuàng)建主貼時(shí),先從Session中取出用戶,然后按其id查出其對(duì)應(yīng)的權(quán)限等級(jí),拿它和執(zhí)行創(chuàng)建主貼所需要的等級(jí)(3)進(jìn)行比較,高于則可進(jìn)行創(chuàng)建主貼操作,否則報(bào)告權(quán)限不夠.
等級(jí)權(quán)限系統(tǒng)簡(jiǎn)單易用,在如論壇等剛性控制系統(tǒng)中使用很好,但不適用于需要限制權(quán)限的范圍的場(chǎng)合。
2.范圍限制權(quán)限系統(tǒng)
等級(jí)權(quán)限系統(tǒng)系統(tǒng)的缺點(diǎn)是控制范圍過(guò)廣,比如一個(gè)論壇中有很多子論壇,一個(gè)子論壇的分版主同時(shí)也能對(duì)另一個(gè)同等級(jí)分論壇的帖子進(jìn)行控制,這在一定程度不合理,有越界的嫌疑,更好的做法是將版主權(quán)限控制在一版之內(nèi),這時(shí)我們可以采用范圍限制權(quán)限系統(tǒng). 這種權(quán)限系統(tǒng)在項(xiàng)目管理系統(tǒng)中很常見.
在等級(jí)權(quán)限系統(tǒng)中領(lǐng)域?qū)ο笥脩纛怳ser的基本屬性如下:
id // 用戶ID
name // 用戶名
領(lǐng)域?qū)ο箜?xiàng)目類Project的基本屬性如下:
id // 項(xiàng)目ID
name // 項(xiàng)目名
領(lǐng)域?qū)ο髾?quán)限類Privilege的基本屬性如下:
id // 權(quán)限ID
userid // 持有此權(quán)限的用戶id
projectid // 此權(quán)限對(duì)應(yīng)的項(xiàng)目
level // 用戶的權(quán)限等級(jí)
其中,通過(guò)引入了新屬性projectid,我們對(duì)權(quán)限的范圍進(jìn)行了有效限制,項(xiàng)目不同則權(quán)限等級(jí)再高也是無(wú)效,這樣就起到了限制權(quán)限能力范圍的作用.
3.范圍限制單項(xiàng)權(quán)限系統(tǒng)
在上面兩個(gè)權(quán)限系統(tǒng)中,權(quán)限高的自然能執(zhí)行權(quán)限要求低的操作,這樣做權(quán)力沒(méi)有細(xì)分,在有些場(chǎng)合并不合理,比如即使是董事長(zhǎng)不可直接操作人事部的招聘任務(wù),他只對(duì)雇員去留有建議權(quán).對(duì)于這樣的場(chǎng)合我們需要使用范圍限制單項(xiàng)權(quán)限系統(tǒng).它的典型應(yīng)用如工作流和OA系統(tǒng)。
在范圍限制單項(xiàng)權(quán)限系統(tǒng)中領(lǐng)域?qū)ο笥脩纛怳ser的基本屬性如下:
id // 用戶ID
name // 用戶名
領(lǐng)域?qū)ο箜?xiàng)目類Project的基本屬性如下:
id // 項(xiàng)目ID
name // 項(xiàng)目名
領(lǐng)域?qū)ο髾?quán)限類Privilege的基本屬性如下:
id // 權(quán)限ID
userid // 持有此權(quán)限的用戶id
projectid // 此權(quán)限對(duì)應(yīng)的項(xiàng)目
abilityid // 權(quán)限控制能力id
領(lǐng)域?qū)ο髾?quán)限控制能力類ability的基本屬性如下:
id // 控制能力ID
item // 控制能力子項(xiàng)
item的設(shè)置示例
item 對(duì)應(yīng)可執(zhí)行的功能
0 讀
1 寫
2 查
3 刪
...
通過(guò)對(duì)權(quán)限能力的細(xì)分,用戶權(quán)限的控制粒度更細(xì)了,對(duì)功能和流程就能有更精確的把握,適用于復(fù)雜的場(chǎng)合.
以上三種權(quán)限系統(tǒng)沒(méi)有優(yōu)劣之分只有適用場(chǎng)合的區(qū)別,前面的粗略但易于操作,后面的精確但失之煩瑣,在現(xiàn)實(shí)使用中我們應(yīng)該根據(jù)場(chǎng)合選擇合適的權(quán)限系統(tǒng).