基于角色的權(quán)限設(shè)計(jì)(一) 在任何系統(tǒng)中,權(quán)限設(shè)計(jì)是最基礎(chǔ)的東西,本文給出一個(gè)基于角色的權(quán)限設(shè)計(jì)的循序漸進(jìn)的設(shè)計(jì)方案。
在權(quán)限系統(tǒng)中,功能(權(quán)限)是最小的單位,比如起草新聞、編輯新聞、審核新聞、刪除新聞等,而角色是一類功能的集合,比如新聞編輯這個(gè)角色,他可能有起草新聞、編輯新聞等功能集合,而責(zé)任編輯他可能就有更多的權(quán)限,比如除了新聞編輯的功能,還有審核新聞、刪除新聞等功能,給張三賦予新聞編輯的角色(其實(shí)我更愿意說把張三加入到新聞編輯這個(gè)角色中去),張三就可以起草新聞、編輯新聞了,給李四賦予責(zé)任編輯的角色,李四就可以起草新聞、編輯新聞、審核新聞、刪除新聞了。 我們來看看版本一的解決方案: 我們來模擬一下上面的數(shù)據(jù): 用戶信息表:
UserID UserName U1 張三 U2 李四 角色表:
角色用戶表:
功能表:
角色功能表:
我們來看看如何判斷一個(gè)用戶具有某個(gè)功能權(quán)限: 首先在用戶張三登錄的時(shí)候,獲取張三的全部功能列表: Select FunctionID From 角色功能表 Where RoleID In (Select RoleID From 用戶角色表 Where UserID=’U 這樣就可以得到張三的全部功能列表Functions,在起草新聞的頁(yè)面我們就可以做如下判斷: Functions.Contain(‘F 如果為true就說明張三有起草新聞的權(quán)限。 當(dāng)然對(duì)于web應(yīng)用,您可以把Functions 用session保存起來,以避免每打開一個(gè)頁(yè)面都去數(shù)據(jù)庫(kù)中獲取。 似乎看起來是一個(gè)不錯(cuò)的解決方案。 還是新聞系統(tǒng),最初新聞系統(tǒng)沒有分類,但是隨著新聞的增加,沒有分類的新聞看起來總是亂的,于是張三和李四給新聞添加了分類A、分類B,還是由張三負(fù)責(zé)起草,李四負(fù)責(zé)審核,以后又添加了更多的分類,并且也增加了人手,這個(gè)時(shí)候就有新的要求出來了:希望張三只負(fù)責(zé)分類A的起草,分類B的起草交給其他人做,李四呢也只負(fù)責(zé)分類A的審核(就相當(dāng)于是一個(gè)欄目的責(zé)任編輯)。 |
|