加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

Winform开发框架之权限管理系统

发布时间:2020-12-12 15:01:52 所属栏目:MsSql教程 来源:网络整理
导读:在前一篇随笔《 Winform开发框架之字典数据管理 》中介绍过我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程序给大家参考学习,下载地址如下:

?http://files.cnblogs.com/wuhuacong/SecurityDemo.rar?

?

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

?http://files.cnblogs.com/wuhuacong/DictionaryDemo.rar

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读