一、引言
ASP.NET為網路系統設計提供了強大的設計功能,其使用簡單,易於上手,是開發網路系統不錯的選擇。在網路系統設計中,使用者權限管理是不可缺少的部分,其設計方法對於許多新手來說是一個較為複雜的問題。作者通過開發實踐,提供了一種基於角色使用者關係的頁面許可權管理通用方法,這也是實際學習中的一些體會,希望可以起到拋磚引玉的作用。
二、資料庫設計
為了實現許可權管理的功能,系統開發中借鑒了Windows的使用者角色管理方法。在資料庫設計中共用了5個表。其中資訊表有三個:UserCode、RoleCode、ModuleCode,分別代表使用者資訊表、使用者組資訊表和模組頁面資訊表。為了表達這三者之間的關係,建立兩個關係表:UserRole和RoleModule,分別代表使用者與使用者組關係、使用者組與模組關係。具體資料庫關係1所示:
具體思路是:使用者在完成系統註冊後,系統管理員可以對其進行管理,給使用者指派不同的使用者組,也就是根據需要對其許可權進行定製。同一使用者可以屬於不同的使用者組,其使用許可權為所賦予使用者組的許可權的最大限度,使用者組為使用者權限的集合,它與模組頁面間建立關係,不同的角色可以訪問不同的頁面集合,整個系統授權過程可以由具備系統管理許可權的使用者來完成。
三、許可權管理
系統許可權管理功能有添加使用者、系統管理使用者、添加使用者組、系統管理使用者組、添加模組、管理模組等六項功能。其中添加使用者、添加使用者組、添加模組等功能對資料表UserCode、RoleCode、ModuleCode分別進行插入操作即可,比較簡單,這裡不再進行介紹,下面重點對使用者管理、使用者組管理、模組管理及這三者之間的相互關係進行重點介紹。
1.使用者管理
使用者管理主要是對使用者進行刪除與授權管理,其管理介面2,當點擊授權後,可以調出所有使用者組並選擇要加入的使用者組。下面將具體介紹授權實現的方法。
圖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;
CheckBox cb = (CheckBox)DataGrid1.Items.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.使用者組管理
圖3 使用者組管理介面
顯示目前使用者組的有權訪問的模組資訊:
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;
CheckBox cb = (CheckBox)DataGrid1.Items.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#進行實現,包括使用者添加、刪除、修改、使用者組的添加、刪除與修改、模組的添加、刪除與修改,使用者與使用者組關係的管理、使用者組與模組關係的管理,這對網路系統的設計具有很強的應用價值。