现在的位置: 首页 > 综合 > 正文

ASP.NET权限管理设计方法

2012年07月31日 ⁄ 综合 ⁄ 共 5503字 ⁄ 字号 评论关闭
一、引言

ASP.NET为网络系统设计提供了强大的设计功能,其使用简单,易于上手,是开发网络系统不错的选择。在网络系统设计中,用户权限管理是不可缺少的部分,其设计方法对于许多新手来说是一个较为复杂的问题。作者通过开发实践,提供了一种基于角色用户关系的页面权限管理通用方法,这也是实际学习中的一些体会,希望可以起到抛砖引玉的作用。

二、数据库设计

为了实现权限管理的功能,系统开发中借鉴了Windows的用户角色管理方法。在数据库设计中共用了5个表。其中信息表有三个:UserCodeRoleCodeModuleCode,分别代表用户信息表、用户组信息表和模块页面信息表。为了表达这三者之间的关系,建立两个关系表:UserRoleRoleModule,分别代表用户与用户组关系、用户组与模块关系。具体数据库关系如图1所示:

1 数据库关系图

具体思路是:用户在完成系统注册后,系统管理员可以对其进行管理,给用户分配不同的用户组,也就是根据需要对其权限进行定制。同一用户可以属于不同的用户组,其使用权限为所赋予用户组的权限的最大限度,用户组为用户权限的集合,它与模块页面间建立关系,不同的角色可以访问不同的页面集合,整个系统授权过程可以由具备系统管理权限的用户来完成。

三、权限管理

系统权限管理功能有添加用户、管理用户、添加用户组、管理用户组、添加模块、管理模块等六项功能。其中添加用户、添加用户组、添加模块等功能对数据表UserCodeRoleCodeModuleCode分别进行插入操作即可,比较简单,这里不再进行介绍,下面重点对用户管理、用户组管理、模块管理及这三者之间的相互关系进行重点介绍。

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#进行实现,包括用户添加、删除、修改、用户组的添加、删除与修改、模块的添加、删除与修改,用户与用户组关系的管理、用户组与模块关系的管理,这对网络系统的设计具有很强的应用价值。

 

抱歉!评论已关闭.