在基于Web的應(yīng)用系統(tǒng)中,經(jīng)常要用到權(quán)限的管理和控制,本文主要探討的是基于用戶組的權(quán)限管理和控制,并采用XML的文檔來描述它,存儲有關(guān)信息。XML的文檔的通用性使得其中的數(shù)據(jù)信息可以被方便地共享和編輯。由于Web系統(tǒng)常常面向的是多個(gè)用戶,每一類用戶又擁有對系統(tǒng)的不同層次的訪問權(quán)限。我們把具有相同訪問權(quán)限的、邏輯上相一致的用戶集合稱為用戶組。
Web系統(tǒng)平臺的用戶群體可以被劃分為多個(gè)具有不同權(quán)限的用戶組,用戶的權(quán)限可分為:可讀(權(quán)限標(biāo)識:1)、可讀寫(權(quán)限標(biāo)識:2)、管理控制(權(quán)限標(biāo)識:3)。它們代表了用戶在系統(tǒng)中扮演的不同角色以及行為限制。據(jù)此,可以將用戶組劃分為三個(gè)等級:第一等級,超級用戶組具有完全控制的權(quán)限,可以配置管理各個(gè)欄目,管理各個(gè)用戶和用戶組,配置系統(tǒng)的總體設(shè)置等;第二等級,各分欄目或模塊管理員組,這些組的用戶特點(diǎn)是擁有對某一欄目或模塊管理控制的權(quán)限;第三等級,普通用戶組,擁有對授權(quán)欄目的可讀權(quán)限或可讀寫權(quán)限。根據(jù)不同的用戶組(權(quán)限)和不同平臺資源之間的映射關(guān)系,可以建立一個(gè)基于XML的文檔來描述它。
……
- 5
- 6
……
……
- 5
- 11
- 12
- 13
- 47
……
……
……
- 9
……
……
powercontrol>
在上面的XML文檔中,對各個(gè)用戶組的訪問控制權(quán)限進(jìn)行了精確的控制。節(jié)點(diǎn)代表了一個(gè)用戶組,屬性id的值是該組的在系統(tǒng)內(nèi)的標(biāo)識。節(jié)點(diǎn)下的各子節(jié)點(diǎn)- 表示了該用戶組可以訪問的欄目或模塊,屬性power的值是對該欄目或模塊訪問的權(quán)限標(biāo)識。
- 節(jié)點(diǎn)下的文本節(jié)點(diǎn)內(nèi)容是該欄目或模塊在系統(tǒng)中的標(biāo)識。例如,標(biāo)識為2的用戶組(在系統(tǒng)中代表某分欄目或模塊管理員組),它對標(biāo)識為11的欄目(或模塊)具有標(biāo)識為1的權(quán)限(在系統(tǒng)中定義為可讀);而對標(biāo)識為5的欄目(或模塊)具有標(biāo)識為3的權(quán)限(在系統(tǒng)中定義為管理控制)。同理,標(biāo)識為1的用戶組(在系統(tǒng)中代表普通用戶組),它對標(biāo)識為5的欄目(或模塊)具有標(biāo)識為1的權(quán)限(在系統(tǒng)中定義為可讀)。
在權(quán)限認(rèn)證模塊中,通過讀取XML配置文件和數(shù)據(jù)庫中的數(shù)據(jù),可以判斷對指定欄目的訪問權(quán)限。
權(quán)限認(rèn)證函數(shù)為:
bool AssertPower(string userGroupID,string ClassID,string OperareID)
userGroupID:當(dāng)前用戶用戶組的id;
ClassID:用戶正要訪問的欄目或模塊;
OperareID:當(dāng)前用戶要進(jìn)行的操作:1:代表讀;2:代表寫;3:代表管理控制
返回值為true表示通過驗(yàn)證;返回值為false表示通過未驗(yàn)證。
具體代碼如下:
//引入命名空間,使程序可以訪問XML類
using System.Xml;
using System.Xml.Schema;
……
XmlDocument doc=new XmlDocument();
XmlNode node,subnode;
//載入配置文件
string xmlFile=Server.MapPath("powercontrol.xml");
doc.Load(xmlFile);
node=doc.DocumentElement.FirstChild;
//遍歷各個(gè)節(jié)點(diǎn)
while (node!=null)
{
//查找當(dāng)前用戶所屬用戶組的節(jié)點(diǎn), userGroupID為當(dāng)前用戶用戶組的id
if (userGroupID==node.Attributes.Item(0).FirstChild.InnerText)
{
subnode=node.FirstChild;
//遍歷各個(gè)子節(jié)點(diǎn)
while (subnode!=null)
{
//查找用戶所訪問欄目的節(jié)點(diǎn)(ClassID為用戶正要訪問的欄目或模塊)
if(subnode.InnerText==ClassID)
{
flag=true;
break;
}
subnode=subnode.NextSibling;
}
}
if(flag) break;
node=node.NextSibling;
}
if(!flag)
{
//沒有訪問的權(quán)限,拒絕訪問
return false;
……
}
else
{
//有訪問的權(quán)限
PowerID=subnode.Attributes.Item(0).FirstChild.InnerText;
// PowerID為1表示可讀;PowerID為2表示可讀寫;PowerID為3表示管理控制。
……
int PID=(int) PowerID;
//判斷當(dāng)前要進(jìn)行的操作是否符合對應(yīng)的權(quán)限要求
if(OperareID<= PID)
{
//符合權(quán)限要求,允許訪問
return true;
}
else
{
//不符合權(quán)限要求,拒絕訪問
return false;
}
}
通過從userGroupID獲取當(dāng)前訪問用戶的用戶組標(biāo)識,從ClassID獲取當(dāng)前正在訪問的欄目或模塊的ID,查找配置文件,取得對該欄目或模塊的訪問權(quán)限與將要進(jìn)行的操作進(jìn)行比較,并做出判斷。
由于該方案是基于用戶組,所以可引入新的用戶組來配置的不同的權(quán)限組合,也可以對該用戶組內(nèi)的各個(gè)子節(jié)點(diǎn)(代表的欄目或模塊)的訪問權(quán)限等級進(jìn)行精確控制。同時(shí)根據(jù)需要可以擴(kuò)展訪問權(quán)限等級(如將現(xiàn)在定義的三級別權(quán)限定義為四級或五級)和增加系統(tǒng)的欄目或模塊。
|
|
文章檢索
編程>熱門文章
|
日期:2007-7-2 22:10:15 |