余楊奎
(湛江開放大學,廣東 湛江 524003)
在互聯(lián)網(wǎng)高速發(fā)展的今天,資源共享日趨完善,資源共享的同時也要阻止非授權用戶對共享資源的訪問。在Web開發(fā)技術中,訪問控制是為了保護Web系統(tǒng)中存儲和處理信息安全的重要手段,權限配置問題是Web開發(fā)技術重點探討的問題,訪問控制提出了權限配置的關鍵解決方案。
目前,傳統(tǒng)的訪問控制一般分為兩類:DAC(discretionary access control,自主訪問控制模型)和MAC(mandatory access control,強制訪問控制模型)[1-2]。RBAC模型由Ferraiolo和Kuhn在1992年提出[3-4],并進行了很多研究。1996年,Sandhu等[4]提出了RBAC96模型。2007年,F(xiàn)erraiolo等[3]整體綜合性地對RBAC進行了描述。2014年,美國國家標準技術研究院(national institute of stands and technology,NIST)提出了RBAC標準及其概念和構架的標準定義[5-6]。此后,也有學者擴展了RBAC模型。例如,蔡婷等[7]針對基于角色的訪問控制(RBAC)模型在模擬復雜組織結構和權限繼承關系方面的不足,提出了基于角色擴展的RBAC模型-MR-RBAC;安沛等[8]針對傳統(tǒng)基于角色的訪問控制模型在授權管理上的缺陷,對RBAC模型進行擴展,采用獨立的安全審計,增強了OA系統(tǒng)的安全性與可靠性;蔡婷等[9]提出一種擴展的基于角色的訪問控制ERBAC模型,以解決RBAC在多域云系統(tǒng)的資源使用約束、策略管理和互操作安全性等方面存在的不足。
RBAC是當今Web服務技術領域受到廣泛關注的授權模型之一,RBAC模型引進了角色的概念,將訪問角色與權限通過多對多關系相聯(lián)系,管理員只需要通過給用戶分配合適的角色,就可以讓用戶與權限相聯(lián)系,用戶通過獲得角色成員的資格來分配對應的訪問權限,用戶權限的更改只需要更改角色即可,而不需要對單個用戶更改權限,系統(tǒng)管理員取消用戶權限,只需要撤銷用戶具有的某個角色,降低了管理員對權限管理的開銷。
ASP.NET支持Web應用程序開發(fā),運用了.net framework提供的功能,與PHP、JSP構成目前三大主流Web開發(fā)技術。與其他Web開發(fā)技術相比,它打破了不能支持強類型語言編寫的局限,并且支持面向對象編程[10]。采用ASP.NET技術進行開發(fā)的所有Web程序都可以無限制地支持異??刂?、類型安全、繼承和動態(tài)編譯[11]。它使用Visual Studio.NET開發(fā),界面友好,支持多種語言,集頁面、控件、代碼和服務于一體,技術成熟,成為眾多Web開發(fā)者的首選[12]。JSP和PHP雖然開放源代碼,但由于英文資料多,對開發(fā)者要求比較高,不容易上手[13]。
RBAC模型通過多對多關系將角色和權限聯(lián)系起來,一個用戶在系統(tǒng)中可能具有多個角色,對每個不同的角色設置多種權限,使用ASP.NET技術實現(xiàn)RBAC模型設計。為解決數(shù)據(jù)庫設計問題,文中選擇使用SQL Server來完成數(shù)據(jù)庫設計。
2.1.1 角色表(bs_user_type)設計
RBAC模型引入角色概念,將用戶(user)歸屬到角色,即成為角色成員。數(shù)據(jù)表字段包括id、角色英文名(typename)、角色中文名(typenameZw)。角色數(shù)據(jù)表結構如圖1所示。
圖1 角色表(bs_user_type)設計圖
2.1.2 權限名稱表(sys_menu)設計
權限名稱表的作用是Web管理員為角色分配權限提供權限對象。數(shù)據(jù)表字段包括id、權限名稱英文名(menucode)、權限名稱中文名(menuname)。權限名稱數(shù)據(jù)表結構如圖2所示。
圖2 權限名稱表(sys_menu)設計圖
2.1.3 關系表(bs_dept_menu)設計
關系表采用多對多關系將角色和權限名稱表進行關聯(lián)。數(shù)據(jù)表字段包括角色表ID(deptCode)、權限名稱英文名(menucode)。Web管理員分配角色權限時,關系表中數(shù)據(jù)字段deptCode值為角色ID、字段menucode值為權限名稱表中權限名稱英文名menucode。關系表數(shù)據(jù)表結構如圖3所示。
圖3 關系表(bs_dept_menu)設計圖
根據(jù)數(shù)據(jù)庫的設計,Web開發(fā)人員只需將角色和權限名稱的中文名稱遍歷出來,Web管理員在配置用戶權限的過程中,將用戶分配到角色,然后再給角色分配相應的權限,按照以上數(shù)據(jù)設計完成數(shù)據(jù)存儲。數(shù)據(jù)表關系如圖4所示。
圖4 數(shù)據(jù)表ER圖
ASP.NET采用三層架構開發(fā)技術,分別是數(shù)據(jù)層、業(yè)務層(數(shù)據(jù)訪問層DAL和業(yè)務邏輯層BLL)和表示層。
2.2.1 表示層界面顯示代碼
ASP.NET表示層選擇使用TreeView控件完成對權限名稱表的遍歷。TreeView控件顯示html代碼如下:
//TreeView控件遍歷權限名稱表
//按鈕觸發(fā)權限分配事件
TreeView控件及按鈕觸發(fā)c#代碼如下:
// TreeView控件遍歷權限名稱表c#代碼,根據(jù)sys_menu表中記錄生成樹
private TreeNodeCollection GetParentNode(TreeNode node, string ccode)
{
if(node==null)return TreeView1.Nodes;
if(ccode.StartsWith(node.Value)) return node.ChildNodes;
return GetParentNode(node.Parent, ccode);
}
//根據(jù)權限項,循環(huán)創(chuàng)建樹
private void CreateTree(string roleType)
{
DataSet ds=user.GetMenus(roleType);
foreach (DataRow dr in ds.Tables[0].Rows)
{
TreeNode node=new TreeNode();
node.Text=Func.ToString(dr["menuname"]);
node.Value=Func.ToString(dr["menucode"]);
node.SelectAction=TreeNodeSelectAction.None;
node.Checked=secNodes.Contains(node.Value);
lastNode=node;
}
}
//根據(jù)角色,讀取角色獲取的權限值
private void PageBind()
{
string usertype=Request.QueryString["id"];
廣西建立了財政部門、主管部門協(xié)同管理專項轉移支付的機制,在分配、下達、執(zhí)行、監(jiān)督、績效方面進一步厘清部門之間對專項轉移支付管理的責任和權力。如在分配環(huán)節(jié),主管部門要在每年10月20日前研究提出資金分配方案,需要報自治區(qū)政府審批的,要求在每年10月15日前研究提出資金分配方案。在下達環(huán)節(jié),財政廳會同主管部門在自治區(qū)人大審查批準自治區(qū)本級預算后60日內(nèi)印發(fā)下達專項轉移支付預算文件。在績效管理方面,主管部門要編制績效目標,實施績效監(jiān)控,開展績效評價等。協(xié)同管理的機制,進一步明晰了責任,形成了對專項轉移支付管理的合力。
if(!string.IsNullOrEmpty(usertype))
{
secNodes=menu.GetMenusByCode(usertype);
CreateTree(usertype);
DataBind();
}
if(this.TreeView1.Nodes.Count<1)
{
ShowMessage(MessageType.Info,"沒有任何菜單可供分配!","","history.back()");
}
}
//按鈕觸發(fā)權限分配事件c#代碼
protected void btn_save_Click(object sender, EventArgs e)
{
string roleCode=Request.QueryString["id"];
List
if(!string.IsNullOrEmpty(roleCode))
{
string secNodes=string.Empty;
GetSecNodes(TreeView1.Nodes, ref secNodes);
if(secNodes !=string.Empty) secNodes += ",";
string[] str=secNodes.Split(',');
foreach (string s in str)
{
if(!string.IsNullOrEmpty(s))
{
strMenus.Add(s);
}
}
menu.AssignMenusToDept(strMenus, roleCode);
}
}
private void GetSecNodes(TreeNodeCollection nodes, ref string secNodes)
{
foreach (TreeNode node in nodes)
{
if(node.Checked)
{
secNodes+="," + node.Value;
GetSecNodes(node.ChildNodes, ref secNodes);
}
}
}
2.2.2 業(yè)務邏輯層設計
public List
{
return DAOMenu.GetMenusByCode(code);
}
public void AssignMenusToDept(List
{
DAOMenu.AssignMenusToDept(menuCodes, deptcode);
}
2.2.3 數(shù)據(jù)訪問層設計
//通過角色代碼獲得角色擁有的權限c#代碼的集合
public static List
{
List
string sql="select * from bs_dept_menu where deptCode=@code";
DataSet ds=SqlDataProvider.GetResultBySql(sql, SqlDataProvider.CreateSqlParameter("@code", SqlDbType.VarChar, code));
foreach (DataRow dr in ds.Tables[0].Rows)
{
menus.Add(Func.ToString(dr["menucode"]));
}
return menus;
}
//把權限名稱分配給角色
public static void AssignMenusToDept(List
{
string sql_del="delete from bs_dept_menu where deptcode=@deptcode";
string sql_ins="insert into bs_dept_menu(deptcode,menucode) values(@deptcode,@menucode)";
SqlDataProvider.ExecuteBySql(sql_del, SqlDataProvider.CreateSqlParameter("@deptcode", SqlDbType.VarChar, deptcode));
foreach (string mc in menuCodes)
{
SqlDataProvider.ExecuteBySql(sql_ins, SqlDataProvider.CreateSqlParameter("@deptcode", SqlDbType.VarChar, deptcode),
SqlDataProvider.CreateSqlParameter("@menucode", SqlDbType.VarChar, mc));
}
}
在Web開發(fā)技術上,從數(shù)據(jù)庫到TreeView控件應用,設計了一個基于RBAC標準的用戶訪問權限管理模型解決方案。該權限管理模型使用ASP.NET技術三層架構實現(xiàn),具有較大的靈活性和可擴展性。實踐證明,檢驗了角色與權限多對多關系的可行性。該模型解決方案有以下優(yōu)勢:角色-權限之間的變化比用戶-權限配置簡單得多,減少了管理員管理的復雜性,提高了工作效率;能夠靈活地支持Web應用系統(tǒng)的安全訪問策略;在操作上,管理員分配權限采用樹目錄操作直觀,簡單易用。