一、引言
ASP.NET为网络系统设计提供了强大的设计功能,其使用简单,易于上手,是开发网络系统不错的选择。在网络系统设计中,用户权限管理是不可缺少的部分,其设计方法对于许多新手来说是一个较为复杂的问题。作者通过开发实践,提供了一种基于角色用户关系的页面权限管理通用方法,这也是实际学习中的一些体会,希望可以起到抛砖引玉的作用。
二、数据库设计
为了实现权限管理的功能,系统开发中借鉴了Windows的用户角色管理方法。在数据库设计中共用了5个表。其中信息表有三个:UserCode、RoleCode、ModuleCode,分别代表用户信息表、用户组信息表和模块页面信息表。为了表达这三者之间的关系,建立两个关系表:UserRole和RoleModule,分别代表用户与用户组关系、用户组与模块关系。具体数据库关系如图1所示:
具体思路是:用户在完成系统注册后,系统管理员可以对其进行管理,给用户分配不同的用户组,也就是根据需要对其权限进行定制。同一用户可以属于不同的用户组,其使用权限为所赋予用户组的权限的最大限度,用户组为用户权限的集合,它与模块页面间建立关系,不同的角色可以访问不同的页面集合,整个系统授权过程可以由具备系统管理权限的用户来完成。
三、权限管理
系统权限管理功能有添加用户、管理用户、添加用户组、管理用户组、添加模块、管理模块等六项功能。其中添加用户、添加用户组、添加模块等功能对数据表UserCode、RoleCode、ModuleCode分别进行插入操作即可,比较简单,这里不再进行介绍,下面重点对用户管理、用户组管理、模块管理及这三者之间的相互关系进行重点介绍。
1.用户管理
用户管理主要是对用户进行删除与授权管理,其管理界面如图2,当点击授权后,可以调出所有用户组并选择要加入的用户组。下面将具体介绍授权实现的方法。
ASP.NET为网络系统设计提供了强大的设计功能,其使用简单,易于上手,是开发网络系统不错的选择。在网络系统设计中,用户权限管理是不可缺少的部分,其设计方法对于许多新手来说是一个较为复杂的问题。作者通过开发实践,提供了一种基于角色用户关系的页面权限管理通用方法,这也是实际学习中的一些体会,希望可以起到抛砖引玉的作用。
二、数据库设计
为了实现权限管理的功能,系统开发中借鉴了Windows的用户角色管理方法。在数据库设计中共用了5个表。其中信息表有三个:UserCode、RoleCode、ModuleCode,分别代表用户信息表、用户组信息表和模块页面信息表。为了表达这三者之间的关系,建立两个关系表:UserRole和RoleModule,分别代表用户与用户组关系、用户组与模块关系。具体数据库关系如图1所示:
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#进行实现,包括用户添加、删除、修改、用户组的添加、删除与修改、模块的添加、删除与修改,用户与用户组关系的管理、用户组与模块关系的管理,这对网络系统的设计具有很强的应用价值。
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#进行实现,包括用户添加、删除、修改、用户组的添加、删除与修改、模块的添加、删除与修改,用户与用户组关系的管理、用户组与模块关系的管理,这对网络系统的设计具有很强的应用价值。