• 【转载】Winform开发框架之权限管理系统


    在前一篇随笔《Winform开发框架之字典数据管理》中介绍过我Winform开发框架的总体情况,其中最重要的思路就是把常用的模块封装成控件进行重复使用,一则可以避免重复开发,提高开发效率;二则可以使用成熟的控件及技术,使得用户体验更好,更加专业。在前面介绍过的Winfrom开发框架总体思路如下所示。

     在Winform框架中,其中权限管理系统、字典管理系统,都是可以做成独立的程序来使用,而且应该可以在程序中引用来查询或者获取相关的字典数据,如找某个键值的字典列表作为下拉列表,而且由于实际项目中,有的是SqlServer、有的是Access数据库的或者其他数据库,所以支持多数据库是最好的选择。 

    本篇主要介绍经过优化完善的权限管理系统, 其既独立又具整合性的权限管理系统,既相互独立,有相互整合,方便重用,又不需重新开发,非常方便、更提高效率。 由于权限系统精简而又能满足日常绝大多数的需要,不会复杂的难于管理,而且也是基于角色的授权访问机制(RBAC),最重要是非常适合软件的整合使用。

    权限管理系统作为一个独立的模块,其主要由登陆界面、权限管理主界面(管理用户、角色、机构、功能,以及控制角色的权限等操作功能,部分界面如下所示。 

     

     

    给用户分配权限,首先是给相应角色授权,角色授权功能如下所示,可以编辑角色使用的功能,也可以管理该角色包含的用户,从而实现间接实现给用户分配权限的功能(这也是基于业界通用的基于角色的访问控制(RBAC)的控制法则)。

      

    经过优化后的权限管理系统,界面及业务逻辑封装到一个类库中,我们开发的业务管理系统中集成就很简单了,主要的项目工程界面如下所示:

     

    我编写了一个测试工程,用来模拟业务系统中调用权限管理模块的例子,界面如下所示:

     

    相关的代码很简单,这也是利用权限管理系统后简化很多代码的根本所在:

             private void Form1_Load(object sender, EventArgs e)
            {
                
    //获取所有权限管理系统的用户,并在下拉列表中展示
                List<UserInfo> userList = BLLFactory<User>.Instance.GetAll();
                
    this.txtLogin.Items.Clear();
                
    foreach (UserInfo info in userList)
                {
                    
    this.txtLogin.Items.Add(info.Name);
                }
            }

            
    private void btnSecurity_Click(object sender, EventArgs e)
            {
                
    //独立启动权限管理系统,只需一行代码即可
                WHC.Security.UI.Portal.StartLogin();
            }

    当然,如果要判断用户的登录及角色等,可以通过下面代码来实现。


                             //判断用户是否登录成功
     
                   string identity = BLLFactory<User>.Instance.VerifyUser(this.txtLogin.Text, this.txtPassword.Text, Guid.NewGuid().ToString());
                    if (!string.IsNullOrEmpty(identity))
                    {
                        
    //进一步判断用户角色
                        if (BLLFactory<User>.Instance.UserInRole(this.txtLogin.Text, "管理员"))
                        {
                            MessageUtil.ShowTips(
    string.Format("用户【{0}】身份验证正确"this.txtLogin.Text));
                        }
                        
    else
                        {
                            MessageUtil.ShowWarning(
    "该用户没有管理员权限");
                            
    return;
                        }
                    }
                    
    else
                    {
                        MessageUtil.ShowWarning(
    "用户名或密码错误");
                        
    return;
                    }

    权限控制的精髓就是,用户登录后,通过把用户拥有的权限获取出来,放到一个功能列表中,然后在每一个窗体中,根据用户的功能列表,显示或者屏蔽对应的功能即可,获取功能列表代码如下所示:

                       UserInfo info = userBLL.GetUserByName(loginName);

                        
    #region 获取用户的功能列表

                        Function functionBLL 
    = new Function();
                        List
    <FunctionInfo> list = functionBLL.GetFunctionsByUser(info.ID, "WareMis");
                        
    if (list != null && list.Count > 0)
                        {
                            
    foreach (FunctionInfo functionInfo in list)
                            {
                                
    if (!Portal.gc.FunctionDict.ContainsKey(functionInfo.ControlID))
                                {
                                    Portal.gc.FunctionDict.Add(functionInfo.ControlID, functionInfo);
                                }
                            }
                        }
                        #endregion 

     判断的时候,放在一个函数,判断用户访问的功能是否在列表中即可,代码如下所示

            /// <summary> 
           
    /// 看用户是否具有某个功能
            
    /// </summary>
            
    /// <param name="controlID"></param>
            
    /// <returns></returns>
            public bool HasFunction(string controlID)
            {
                
    bool result = false;
                
    if (FunctionDict.ContainsKey(controlID))
                {
                    result 
    = true;
                }

                
    return result;
            }

    那么控制用户显示的界面代码如下所示:

                 #region KTV包间管理
                
    if (Portal.gc.HasFunction("KTV"))
                {
                    OutlookBarBand myBasicBand 
    = new OutlookBarBand("KTV包间管理");
                    myBasicBand.SmallImageList 
    = this.imageList;
                    myBasicBand.LargeImageList 
    = this.imageList;
                    
    if (Portal.gc.HasFunction("KTV/View"))
                    {
                        myBasicBand.Items.Add(
    new OutlookBarItem("KTV包间状态视图"0));
                    }
                    
    if (Portal.gc.HasFunction("KTV/Setting"))
                    {
                        myBasicBand.Items.Add(
    new OutlookBarItem("KTV包间设置"1));
                    }
                    
    if (Portal.gc.HasFunction("KTV/Goods"))
                    {
                        myBasicBand.Items.Add(
    new OutlookBarItem("KTV商品设置"3));
                    }
                    
    if (Portal.gc.HasFunction("KTV/Waiter"))
                    {
                        myBasicBand.Items.Add(
    new OutlookBarItem("KTV服务生管理"4));
                    }
                    
    if (Portal.gc.HasFunction("KTV/BookIn"))
                    {
                        myBasicBand.Items.Add(
    new OutlookBarItem("KTV预订管理"5));
                    }
                    
    if (Portal.gc.HasFunction("KTV/OtherIncome"))
                    {
                        myBasicBand.Items.Add(
    new OutlookBarItem("KTV其他款项登记"6));
                    }
                    myBasicBand.Background 
    = SystemColors.AppWorkspace;
                    myBasicBand.TextColor 
    = Color.White;
                    outlookBar1.Bands.Add(myBasicBand);
                }
                
    #endregion

       判断菜单或者功能按钮,也只需要判断某功能点是否在已有集合中即可,如下所示:

             /// <summary>
            
    /// 根据权限屏蔽功能
            
    /// </summary>
            private void InitAuthorizedUI()
            {
                
    this.tool_Report.Enabled = Portal.gc.HasFunction("Report");
                
    this.tool_Dict.Enabled= Portal.gc.HasFunction("Dictionary");
                
    this.tool_ItemDetail.Enabled = Portal.gc.HasFunction("ItemDetail");
                
    this.tool_Purchase.Enabled = Portal.gc.HasFunction("Purchase");
                
    this.tool_StockSearch.Enabled = Portal.gc.HasFunction("StockSearch");
                
    this.tool_TakeOut.Enabled = Portal.gc.HasFunction("TakeOut");

                
    this.menu_WareHouse.Enabled = Portal.gc.HasFunction("WareHouse");
                
    this.menu_Dictionary.Enabled = Portal.gc.HasFunction("Dictionary");
                
    this.menu_run_systemLog.Enabled = Portal.gc.HasFunction("LoginLog");
                
    this.menu_Parameters.Enabled = Portal.gc.HasFunction("Parameters");
                
    this.menu_MonthlyStatistic.Enabled = Portal.gc.HasFunction("MonthlyStatistic");
                
    this.menu_AnnualStatistic.Enabled = Portal.gc.HasFunction("AnnualStatistic");
                
    this.menu_ClearAll.Enabled = Portal.gc.HasFunction("ClearAllData");
                
    this.menu_ImportItemDetail.Enabled = Portal.gc.HasFunction("ImportItemDetail");
            }
     

    至此,权限管理模块介绍已经完毕,下面给出一个调用例子Demo程序给大家参考学习,下载地址如下:

     https://files.cnblogs.com/wuhuacong/SecurityDemo.rar 

    前一篇文件的字典组件模块调用例子Demo程序下载地址也一并提供下载,下载地址如下:

     https://files.cnblogs.com/wuhuacong/DictionaryDemo.rar

  • 相关阅读:
    博弈最高位POJ 1704(Georgia and BobNim博弈)
    图片优化ios学习之真机测试 copy图片错误解决方案
    输入左移校草计划(Nim)
    类型函数C语言void关键字
    图层设置GDAL/OGR创建DXF文件中多图层的方法
    浏览器下载Firefox os 模拟器安装教程步骤详解
    工程图标ios学习之给程序设置logo
    实例收藏Android开发环境搭建和Android开发基础知识汇总值得收藏
    乱码插入mac mysql汉字乱码问题解决
    菜菜从零学习WCF一(WCF概述)
  • 原文地址:https://www.cnblogs.com/fx2008/p/2281948.html
Copyright © 2020-2023  润新知