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