zoukankan      html  css  js  c++  java
  • 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;
        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#进行实现,包括用户添加、删除、修改、用户组的添加、删除与修改、模块的添加、删除与修改,用户与用户组关系的管理、用户组与模块关系的管理,这对网络系统的设计具有很强的应用价值。
  • 相关阅读:
    url_encode and url_decode in Shell
    学嵌入式技术,做高端电子工程师
    MCU助推居家移动医疗微型化
    深圳单片机培训,7月盛大开班,报名既送
    中国嵌入式工控机市场前景广阔
    嵌入式 现已发展为 IT行业的主流——高薪,且人才缺乏
    谷歌苹果已“技穷”?移动操作系统2013无创新
    C# 与 C++,语法差别有多小-其他2
    link
    C# 与 C++,语法差别有多小-第三章 C++数据类型 第一部分
  • 原文地址:https://www.cnblogs.com/yongheng178/p/1765456.html
Copyright © 2011-2022 走看看