字段的权限控制,一般就是控制对应角色人员对某个业务对象的一些敏感字段的可访问性:包括可见、可编辑性等处理。本篇随笔结合基于SqlSugar的开发框架进行的字段控制管理介绍。

在设计字段权限的时候,我们需要了解这些还是基于RBAC的概念,基于角色进行授权的,而且我们的字段列表是属于具体的业务对象列表的,这里的业务对象是指一些我们具体的业务模块,如客户基础信息、人员基础信息、报价单等等,我们就是基于这些业务进行字段的控制的。

1、字段权限表的设计和界面管理

基于SqlSugar的开发框架,对应处理的业务对象信息的,是相关的实体对象信息,我们在数据库中设计两个数据库,一个用于存储对应实体类名称的信息,如ID,实体类全名,类路径等主体信息;一个存储对应角色配置的字段列表信息,结合起来就可以实现对应角色的字段权限控制了,数据库表设计信息如下所示。

两个业务表的部分字段信息如下所示。

系统中对于字段权限的设置界面如下所示。

通过列表对每个实体对象信息进行配置,如果没有对应的实体,从程序集中选择列出来即可加入进来。

加入对应的实体信息,我们可以根据名称反射接口获得对应字段参考的中文信息,然后进行展示,用于加入控制列表。

这样配置后,系统就记录了相关的配置信息,我们接下来就可以利用这些配置信息,在Winform界面上进行控件的显示处理操作了。

2、在Winform界面上进行控件的显示处理操作

在界面上,我们为了绑定界面控件和字段的关系,需要设置一个Tag来标识,然后根据系统配置信息,自动进行字段权限的控制处理(隐藏、设置只读,不限制等)

  1. /// <summary>
  2. /// 设置控件字段的权限显示或者隐藏(默认不使用字段权限)
  3. /// </summary>
  4. private async void SetPermit()
  5. {
  6. #region 设置控件和字段的对应关系
  7.  
  8. this.txtName.Tag = "Name";
  9. this.txtAge.Tag = "Age";
  10.  
  11. #endregion
  12.  
  13. //获取列表权限的列表
  14. var permitDict = await BLLFactory<IFieldPermitService>.Instance.GetColumnsPermit(typeof(CustomerInfo).FullName, LoginUserInfo.Id.ToInt32());
  15. this.SetControlPermit(permitDict, this.layoutControl1);
  16.  
  17. await Task.CompletedTask;
  18. }

设置控件的字段显示方式 SetControlPermit ,代码如下所示。

  1. /// <summary>
  2. /// 设置控件的可见、读写权限显示
  3. /// </summary>
  4. /// <param name="panel">控件对象</param>
  5. /// <param name="permitDict">字段和权限字典,字典值为权限控制:0可读写,1只读,2隐藏值,3不显示</param>
  6. /// <param name="layoutControl">如果存在布局,则使用布局控件,否则为空</param>
  7. public static void SetControlPermit(this Control panel, Dictionary<string, int> permitDict, LayoutControl layoutControl = null)
  8. {
  9. foreach (Control ctrl in panel.Controls)
  10. {
  11. var baseCtrl = ctrl as BaseEdit;
  12. if (baseCtrl != null)
  13. {
  14. var tag = string.Concat(baseCtrl.Tag);
  15. if (!string.IsNullOrEmpty(tag) && permitDict.ContainsKey(tag))
  16. {
  17. var permit = permitDict[tag];
  18. var visible = (permit == 0 || permit == 1);//2、3不可见
  19.  
  20. if (layoutControl != null)
  21. {
  22. var layoutItem = layoutControl.GetItemByControl(baseCtrl);
  23. if (layoutItem != null)
  24. {
  25. layoutItem.ToVisibility(visible);
  26. }
  27. }
  28. baseCtrl.Visible = visible;
  29. baseCtrl.ReadOnly = permit == 1;
  30. }
  31. }
  32. ctrl.SetControlPermit(permitDict, layoutControl);
  33. }
  34. }

上面代码主要就是变量面板中的控件,并判断tag标签,然后进行只读、不可见、正常等的判断。

在列表界面中,我们可以通过设置隐藏字符让内容隐藏,如下界面效果所示。

如果不可见,就在界面上不显示这个列了,而非隐藏。

同样类似编辑控件界面,我们在列表界面也提供了对应的方法,用于隐藏列表字段的某些信息,如下代码所示。

  1. //获取字段显示权限,并设置(默认不使用字段权限)
  2. this.winGridViewPager1.gridView1.SetColumnsPermit(permitDict);

它的实现规则也是类似,根据配置的字段权限控制点信息进行处理,决定是否显示,是否隐藏,是否正常处理。

它的permitDic也是根据配置信息读取出来进行判断即可。

  1. //根据业务对象获取对应的显示字段,如果没有设置,那么根据FieldPermit表的配置获取字段权限列表
  2. var permitDict = await BLLFactory<IFieldPermitService>.Instance.GetColumnsPermit(typeof(BlackIPInfo).FullName, Portal.gc.UserInfo.Id);
  3. var displayColumns = await BLLFactory<IBlackIPService>.Instance.GetDisplayColumns();
  4. if (permitDict != null && permitDict.Keys.Count > 0)
  5. {
  6. //0可读写,1只读,2隐藏值,3不显示
  7. displayColumns = string.Join(",", permitDict.Keys.Where(s => permitDict[s] < 2));
  8. }
  9. this.winGridViewPager1.DisplayColumns = displayColumns;

下面是具体逻辑的通用控制方法,把它作为控件的扩展函数,我们就只需要一行代码调用就是写控制了

  1. /// <summary>
  2. /// 根据参数权限字典的值:0可读写,1只读,2隐藏值,3不显示,设置列的权限。
  3. /// </summary>
  4. /// <param name="gridView">GridView对象</param>
  5. /// <param name="fieNamePermitDict">字段和权限字典,字典值为权限控制:0可读写,1只读,2隐藏值,3不显示</param>
  6. public static void SetColumnsPermit(this GridView gridView, Dictionary<string,int> fieNamePermitDict)
  7. {
  8. char passwordChar = '*';
  9. foreach (GridColumn col in gridView.Columns)
  10. {
  11. var include = fieNamePermitDict.ContainsKey(col.FieldName);
  12. if (include)
  13. {
  14. int permit = fieNamePermitDict[col.FieldName];
  15. switch (permit)
  16. {
  17. case 0://正常可见、可读写
  18. col.OptionsColumn.AllowEdit = true;
  19. col.OptionsColumn.ReadOnly = false;
  20. col.AppearanceHeader.ForeColor = Color.Black;
  21.  
  22. col.Visible = true;
  23. break;
  24.  
  25. case 1:
  26. //只读
  27. col.OptionsColumn.AllowEdit = false;
  28. col.OptionsColumn.ReadOnly = true;
  29. col.AppearanceHeader.ForeColor = Color.Gray;
  30.  
  31. col.Visible = true;
  32. break;
  33.  
  34. case 2:
  35. //隐藏值
  36. var edit = col.CreateTextEdit();
  37. col.Tag = string.Concat(passwordChar);//用来在界面端进行判断,避免设置DisplayText
  38. edit.PasswordChar = passwordChar;
  39. col.Visible = true;
  40. break;
  41.  
  42. case 3:
  43. //不可见
  44. col.Visible = false;
  45. break;
  46. }
  47. }
  48. }
  49. }

通过上面的代码处理,我们就能实现对Winform界面中的列表,编辑窗体的控件,进行相关的字段权限控制显示了。如下是实现的界面效果。

这样在系统后台,就可以根据需要设置一些敏感字段的信息隐藏或者只读处理了。

基于SqlSugar的开发框架循序渐进介绍(9)-- 结合Winform控件实现字段的权限控制的更多相关文章

  1. 基于SqlSugar的开发框架循序渐进介绍(12)-- 拆分页面模块内容为组件,实现分而治之的处理

    在早期的随笔就介绍过,把常规页面的内容拆分为几个不同的组件,如普通的页面,包括列表查询.详细资料查看.新增资料.编辑资料.导入资料等页面场景,这些内容相对比较独立,而有一定的代码量,本篇随笔介绍基于V ...

  2. 基于SqlSugar的开发框架循序渐进介绍(13)-- 基于ElementPlus的上传组件进行封装,便于项目使用

    在我们实际项目开发过程中,往往需要根据实际情况,对组件进行封装,以更简便的在界面代码中使用,在实际的前端应用中,适当的组件封装,可以减少很多重复的界面代码,并且能够非常简便的使用,本篇随笔介绍基于El ...

  3. 基于SqlSugar的开发框架循序渐进介绍(14)-- 基于Vue3+TypeScript的全局对象的注入和使用

    刚完成一些前端项目的开发,腾出精力来总结一些前端开发的技术点,以及继续完善基于SqlSugar的开发框架循序渐进介绍的系列文章,本篇随笔主要介绍一下基于Vue3+TypeScript的全局对象的注入和 ...

  4. 基于SqlSugar的开发框架循序渐进介绍(17)-- 基于CSRedis实现缓存的处理

    在一个应用系统的开发框架中,往往很多地方需要用到缓存的处理,有些地方是为了便于记录用户的数据,有些地方是为了提高系统的响应速度,如有时候我们在发送一个短信验证码的时候,可以在缓存中设置几分钟的过期时间 ...

  5. 基于SqlSugar的开发框架循序渐进介绍(20)-- 在基于UniApp+Vue的移动端实现多条件查询的处理

    在做一些常规应用的时候,我们往往需要确定条件的内容,以便在后台进行区分的进行精确查询,在移动端,由于受限于屏幕界面的情况,一般会对多个指定的条件进行模糊的搜索,而这个搜索的处理,也是和前者强类型的条件 ...

  6. 基于SqlSugar的开发框架循序渐进介绍(21)-- 在工作流列表页面中增加一些转义信息的输出,在后端进行内容转换

    有时候,为了给前端页面输出内容,有时候我们需要准备和数据库不一样的实体信息,因为数据库可能记录的是一些引用的ID或者特殊字符,那么我们为了避免前端单独的进行转义处理,我们可以在后端进行统一的格式化后再 ...

  7. 基于SqlSugar的开发框架循序渐进介绍(3)-- 实现代码生成工具Database2Sharp的整合开发

    我喜欢在一个项目开发模式成熟的时候,使用代码生成工具Database2Sharp来配套相关的代码生成,对于我介绍的基于SqlSugar的开发框架,从整体架构确定下来后,我就着手为它们量身定做相关的代码 ...

  8. 基于SqlSugar的开发框架循序渐进介绍(4)-- 在数据访问基类中对GUID主键进行自动赋值处理

    我们在设计数据库表的时候,往往为了方便,主键ID一般采用字符串类型或者GUID类型,这样对于数据库表记录的迁移非常方便,而且有时候可以在处理关联记录的时候,提前对应的ID值.但有时候进行数据记录插入的 ...

  9. 基于SqlSugar的开发框架循序渐进介绍(5)-- 在服务层使用接口注入方式实现IOC控制反转

    在前面随笔,我们介绍过这个基于SqlSugar的开发框架,我们区分Interface.Modal.Service三个目录来放置不同的内容,其中Modal是SqlSugar的映射实体,Interface ...

随机推荐

  1. 【图像处理】Golang 获取JPG图像的宽高

    一.背景 有些业务需要判断图片的宽高,来做一些图片相关缩放,旋转等基础操作. 但是图片缩放,旋转,拼接等操作需要将图片从 JPG 格式转成 RGBA 格式操作,操作完毕后,再转回 JPG 图片. 那如 ...

  2. Solon 1.6.36 发布,更现代感的应用开发框架

    相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...

  3. AcWing 158. 项链 (最小表示法)

    项链 题源:https://www.acwing.com/problem/content/160/ 题目 原理:最小表示法 找字典序最小的字符串 循环移位,破环成链 (把原串复制一倍) memcpy ...

  4. jsp第六次作业

    1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8&quo ...

  5. DFA算法之内容敏感词过滤

    DFA 算法是通过提前构造出一个 树状查找结构,之后根据输入在该树状结构中就可以进行非常高效的查找. 设我们有一个敏感词库,词酷中的词汇为:我爱你我爱他我爱她我爱你呀我爱他呀我爱她呀我爱她啊 那么就可 ...

  6. Linux-进程工具

    1.进程树 pstree pstree 可以用来显示进程的父子关系,以树形结构显示 格式: pstree [OPTION] [ PID | USER ] 常用选项: -p 显示PID -T 不显示线程 ...

  7. asp.net swagger的使用

    最近要从其他系统获取一些数据,准备写个接口让别人把数据塞进来,顺便学习一下如何使用Swagger. 参考大神的教程:asp.net  https://mp.weixin.qq.com/s/SHNNQo ...

  8. 老生常谈系列之Aop--前言

    老生常谈系列之Aop--前言 前言 既然是前言,那么这一篇就不会写具体的技术问题.这篇文章主要记录我一些个人的思考以及为什么要写文章的缘由.前不久在跟朋友的交流中偶然聊到了Aop,Aop全称为 Asp ...

  9. HTTP.sys远程执行代码漏洞检测

    1.漏洞描述:HTTP 协议栈 (HTTP.sys) 中存在一个远程执行代码漏洞,这是 HTTP.sys 不正确地分析特制 HTTP 请求时导致的.成功利用此漏洞的攻击者可以在系统帐户的上下文中执行任 ...

  10. Fuzzing101系列 Exercise 1 - Xpdf

    序言 Fuzzing101系列包含针对10 个真实目标的10个练习,在练习中一步一步学习Fuzzing技术的知识. 模糊测试(Fuzzing/Fuzz)是一种自动化软件测试技术,它基于为程序提供随机或 ...