你好,欢迎来到电脑编程技巧与维护杂志社! [免费注册][请登录 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 计算机安全与维护
权限管理设计方法
 

       本文借鉴用户角色管理模式的经验,设计了一种基于页面的权限控制方法,并用ASP.NET进行了系统实现,该方法为网络系统权限功能设计提供了一条很好的思路。

    关键词  ASP.NET,权限管理

  

一、引言

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[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所示,下面将具体介绍授权实现方法。


 

 

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

 

  推荐精品文章

·黑客频频攻击区块链安全软肋,如何保证区…
·阿里、商汤在香港设立人工智能实验室 本月…
·云端的竞争:巨头纷纷加码云市场
·中国云体系联盟主办未来科技独角兽与行业…
·Gartner:企业首席信息官们可能没有注意到…
·微软开源Azure云服务AI引擎Infer.NET
·创新指纹读取器出炉:平均准确率最高可达…
·微软投资东南亚出行公司Grab 将进行AI等技…
·Facebook开发AI系统:看美食图片能自动生…
·工信部:促进区块链与实体经济深度融合
·谷歌首度证实了重返中国的Dragonfly计划的…
·Java 11正式发布,告诉你到底应不应该升级…
·Stack Overflow 10 周年了,作为程序员你…
·新手初学Python最常犯的十个错误,其中有…

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备06048724号,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区长春桥路5号6号楼1209室,邮编:100089