
在之前的文章中介绍过Winform开发框架的总体情况其中最重要的思路就是把常用的模块封装成控件进行重复使用一则可以避免重复开发提高开发效率二则可以使用成熟的控件及技术使得用户体验更好更加专业在前面介绍过的Winfrom开发框架总体思路如下所示。在Winform框架中其中权限管理系统、字典管理系统都是可以做成独立的程序来使用而且应该可以在程序中引用来查询或者获取相关的字典数据如找某个键值的字典列表作为下拉列表而且由于实际项目中有的是SqlServer、有的是Access数据库的或者其他数据库所以支持多数据库是最好的选择。本篇主要介绍经过优化完善的权限管理系统 其既独立又具整合性的权限管理系统既相互独立有相互整合方便重用又不需重新开发非常方便、更提高效率。 由于权限系统精简而又能满足日常绝大多数的需要不会复杂的难于管理而且也是基于角色的授权访问机制RBAC最重要是非常适合软件的整合使用。权限管理系统作为一个独立的模块其主要由登陆界面、权限管理主界面管理用户、角色、机构、功能以及控制角色的权限等操作功能部分界面如下所示。给用户分配权限首先是给相应角色授权角色授权功能如下所示可以编辑角色使用的功能也可以管理该角色包含的用户从而实现间接实现给用户分配权限的功能这也是基于业界通用的基于角色的访问控制RBAC的控制法则。经过优化后的权限管理系统界面及业务逻辑封装到一个类库中我们开发的业务管理系统中集成就很简单了主要的项目工程界面如下所示我编写了一个测试工程用来模拟业务系统中调用权限管理模块的例子界面如下所示相关的代码很简单这也是利用权限管理系统后简化很多代码的根本所在private void Form1_Load(object sender, EventArgs e) { //获取所有权限管理系统的用户并在下拉列表中展示 ListUserInfo userList BLLFactoryUser.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 BLLFactoryUser.Instance.VerifyUser(this.txtLogin.Text, this.txtPassword.Text, Guid.NewGuid().ToString()); if (!string.IsNullOrEmpty(identity)) { //进一步判断用户角色 if (BLLFactoryUser.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(); ListFunctionInfo 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 namecontrolID/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); }至此权限管理模块介绍已经完毕。本文转载自博客园 - 伍华聪