摘 要 本文借鑒用戶角色管理模式的經驗,設計了一種基于頁面的權限控制方法,并用ASP.NET進行了系統實現,該方法為網絡系統權限功能設計提供了一條很好的思路。
關鍵詞 ASP.NET,權限管理
一、引言
ASP.NET為網絡系統設計提供了強大的設計功能,其使用簡單,易于上手,是開發網絡系統不錯的選擇。在網絡系統設計中,用戶權限管理是不可缺少的部分,其設計方法對于許多新手來說是一個較為復雜的問題。作者通過開發實踐,提供了一種基于角色用戶關系的頁面權限管理通用方法,這也是實際學習中的一些體會,希望可以起到拋磚引玉的作用。
二、數據庫設計
為了實現權限管理的功能,系統開發中借鑒了Windows的用戶角色管理方法。在數據庫設計中共用了5個表。其中信息表有三個:UserCode、RoleCode、ModuleCode,分別代表用戶信息表、用戶組信息表和模塊頁面信息表。為了表達這三者之間的關系,建立兩個關系表:UserRole和RoleModule,分別代表用戶與用戶組關系、用戶組與模塊關系。具體數據庫關系如圖1所示:

具體思路是:用戶在完成系統注冊后,系統管理員可以對其進行管理,給用戶分配不同的用戶組,也就是根據需要對其權限進行定制。同一用戶可以屬于不同的用戶組,其使用權限為所賦予用戶組的權限的最大限度,用戶組為用戶權限的集合,它與模塊頁面間建立關系,不同的角色可以訪問不同的頁面集合,整個系統授權過程可以由具備系統管理權限的用戶來完成。
三、權限管理
系統權限管理功能有添加用戶、管理用戶、添加用戶組、管理用戶組、添加模塊、管理模塊等六項功能。其中添加用戶、添加用戶組、添加模塊等功能對數據表UserCode、RoleCode、ModuleCode分別進行插入操作即可,比較簡單,這里不再進行介紹,下面重點對用戶管理、用戶組管理、模塊管理及這三者之間的相互關系進行重點介紹。
1.用戶管理
用戶管理主要是對用戶進行刪除與授權管理,其管理界面如圖2,當點擊授權后,可以調出所有用戶組并選擇要加入的用戶組。下面將具體介紹授權實現的方法。

首先要顯示當前用戶所屬的用戶組:
public SqlDataReader SelectByUserRole(int userid,int roleid)
{
Database data = new Database();
SqlDataReader reader = null;
SqlParameter[] prams = { data.MakeInParam("@UserID",System.Data.SqlDbType.Int,4,userid),
data.MakeInParam("@RoleID",System.Data.SqlDbType.Int,4,roleid)};
data.RunProc("UserRole_SelectByUserRole",prams,out reader);
return reader;
}
其中Database為數據訪問的基礎類,提供了運行SQL命令與存儲過程的基本功能。存儲過程UserRole_SelectByUserRole代碼如下:
CREATE PROCEDURE dbo.UserRole_SelectByUserRole
@UserID int,@RoleID int
AS
select * from UserRole where UserID=@UserID and RoleID=@RoleID
然后更改當前用戶所屬的用戶組:
//先對原來的用戶授權進行刪除
int userid = int.Parse(Request.QueryString["userid"]);
CUserRole ur = new CUserRole();
ur.DeleteByUserID(userid);
//開始對選擇的項進行增加
int i;
int rowcount = DataGrid1.Items.Count;
for(i=0;i<rowcount;i++)
{
//檢查是否在關系表中存在
int roleid = (int)DataGrid1.DataKeys[i];
CheckBox cb = (CheckBox)DataGrid1.Items[i].Cells[1].Controls[1];
if(cb.Checked==true)
{
ur.Create(userid,roleid,"");
}
}
CUserRole類的Create函數如下:
public bool Create(Int32 userID,Int32 roleID,String memo)
{
Database data = new Database();
SqlParameter[] prams = { data.MakeInParam("@UserID",System.Data.SqlDbType.Int,4,userID),
data.MakeInParam("@RoleID",System.Data.SqlDbType.Int,4,roleID),
data.MakeInParam("@Memo",System.Data.SqlDbType.Char,100,memo) };
int reval = data.RunProc("UserRole_Create",prams);
data.Close();
data.Dispose();
if(reval==1)
{
return true;
}
else
{
return false;
}
}
存儲過程UserRole_Create的代碼如下:
CREATE PROCEDURE dbo.UserRole_Create
@UserID int,@RoleID int,@Memo char(100)
AS
begin tran
insert into UserRole (UserID,RoleID,Memo) values(@UserID,@RoleID,@Memo)
if @@error!=0
begin
rollback
return 0
end
else
begin
commit
return 1
end
2.用戶組管理
用戶組管理界面如圖2所示,下面將具體介紹授權實現方法。

顯示當前用戶組的有權訪問的模塊信息:
public SqlDataReader SelectByRoleModule(int roleid,int moduleid)
{
Database data = new Database();
SqlDataReader reader = null;
SqlParameter[] prams = {
data.MakeInParam("@RoleID",System.Data.SqlDbType.Int,4,roleid),
data.MakeInParam("@ModuleID",System.Data.SqlDbType.Int,4,moduleid)};
data.RunProc("RoleModule_SelectByRoleModule",prams,out reader);
return reader;
}
存儲過程RoleModule_SelectByRoleModule的定義為:
CREATE PROCEDURE dbo.RoleModule_SelectByRoleModule
@RoleID int,@ModuleID int
AS
select * from RoleModule where RoleID=@RoleID and ModuleID=@ModuleID
在獲得當前用戶組的授權模塊信息后,可以對DataGrid中的CheckBox進行初始化設置。當前用戶組模塊信息的設置如下。
int roleid = int.Parse(Request.QueryString["RoleID"]);
CRoleModule rm = new CRoleModule();
rm.DeleteByRoleID(roleid);
//開始對選擇的項進行增加
int i;
int rowcount = DataGrid1.Items.Count;
for(i=0;i<rowcount;i++)
{
//檢查是否在關系表中存在
int moduleid = (int)DataGrid1.DataKeys[i];
CheckBox cb = (CheckBox)DataGrid1.Items[i].Cells[1].Controls[1];
if(cb.Checked==true)
{
rm.Create(roleid,moduleid);
}
}
其方法與用戶授權方法基本類型,在此不再展開描述。
3.頁面權限分析
在Page_Load()事件中加載下面的函數進行權限分析
private void CheckRight(string loginid,string pagename)
{
CCheckRightView cr = new CCheckRightView();
SqlDataReader dr = null;
dr = cr.Select(loginid,pagename);
if(dr.Read()==false)
{
Response.Write("<script language=javascript>");
Response.Write("alert('您沒有訪問該模塊的權限');");
Response.Write("document.location.href='Login.aspx';");
Response.Write("</script>");
return;
}
}
//CCheckRightView的Select函數事件
public SqlDataReader Select(String loginID,String modulePage)
{
Database data = new Database();
SqlDataReader reader = null;
SqlParameter[] prams = {
data.MakeInParam("@LoginID",System.Data.SqlDbType.VarChar,20,loginID),
data.MakeInParam("@ModulePage",System.Data.SqlDbType.NVarChar,100,modulePage)
};
data.RunProc("CheckRightView_SelectInfo",prams,out reader);
return reader;
}
//視圖CheckRightView的代碼如下:
CREATE VIEW dbo.CheckRightView
AS
SELECT dbo.UserCode.LoginID, dbo.ModuleCode.ModulePage
FROM dbo.UserCode INNER JOIN dbo.ModuleCode INNER JOIN dbo.RoleCode INNER JOIN
dbo.RoleModule ON dbo.RoleCode.RoleID = dbo.RoleModule.RoleID ON
dbo.ModuleCode.ModuleID = dbo.RoleModule.ModuleID INNER JOIN
dbo.UserRole ON dbo.RoleCode.RoleID = dbo.UserRole.RoleID ON
dbo.UserCode.UserID = dbo.UserRole.UserID
存儲過程CheckRightView_SelectInfo的代碼如下:
CREATE PROCEDURE dbo.CheckRightView_SelectInfo
@LoginID varchar(20),@ModulePage nvarchar(100)
AS
select * from CheckRightView where LoginID=@LoginID and ModulePage=@ModulePage
四、結語
本文設計了基于頁面權限管理的方法,在ASP.NET利用C#進行實現,包括用戶添加、刪除、修改、用戶組的添加、刪除與修改、模塊的添加、刪除與修改,用戶與用戶組關系的管理、用戶組與模塊關系的管理,這對網絡系統的設計具有很強的應用價值。
|