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

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

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

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

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

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

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

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

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

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

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

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

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

        /// <summary>
/// 设置控件的可见、读写权限显示
/// </summary>
/// <param name="panel">控件对象</param>
/// <param name="permitDict">字段和权限字典,字典值为权限控制:0可读写,1只读,2隐藏值,3不显示</param>
/// <param name="layoutControl">如果存在布局,则使用布局控件,否则为空</param>
public static void SetControlPermit(this Control panel, Dictionary<string, int> permitDict, LayoutControl layoutControl = null)
{
foreach (Control ctrl in panel.Controls)
{
var baseCtrl = ctrl as BaseEdit;
if (baseCtrl != null)
{
var tag = string.Concat(baseCtrl.Tag);
if (!string.IsNullOrEmpty(tag) && permitDict.ContainsKey(tag))
{
var permit = permitDict[tag];
var visible = (permit == 0 || permit == 1);//2、3不可见 if (layoutControl != null)
{
var layoutItem = layoutControl.GetItemByControl(baseCtrl);
if (layoutItem != null)
{
layoutItem.ToVisibility(visible);
}
}
baseCtrl.Visible = visible;
baseCtrl.ReadOnly = permit == 1;
}
}
ctrl.SetControlPermit(permitDict, layoutControl);
}
}

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

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

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

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

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

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

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

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

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

/// <summary>
/// 根据参数权限字典的值:0可读写,1只读,2隐藏值,3不显示,设置列的权限。
/// </summary>
/// <param name="gridView">GridView对象</param>
/// <param name="fieNamePermitDict">字段和权限字典,字典值为权限控制:0可读写,1只读,2隐藏值,3不显示</param>
public static void SetColumnsPermit(this GridView gridView, Dictionary<string,int> fieNamePermitDict)
{
char passwordChar = '*';
foreach (GridColumn col in gridView.Columns)
{
var include = fieNamePermitDict.ContainsKey(col.FieldName);
if (include)
{
int permit = fieNamePermitDict[col.FieldName];
switch (permit)
{
case 0://正常可见、可读写
col.OptionsColumn.AllowEdit = true;
col.OptionsColumn.ReadOnly = false;
col.AppearanceHeader.ForeColor = Color.Black; col.Visible = true;
break; case 1:
//只读
col.OptionsColumn.AllowEdit = false;
col.OptionsColumn.ReadOnly = true;
col.AppearanceHeader.ForeColor = Color.Gray; col.Visible = true;
break; case 2:
//隐藏值
var edit = col.CreateTextEdit();
col.Tag = string.Concat(passwordChar);//用来在界面端进行判断,避免设置DisplayText
edit.PasswordChar = passwordChar;
col.Visible = true;
break; case 3:
//不可见
col.Visible = false;
break;
}
}
}
}

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

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

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

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

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

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

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

  3. 基于SqlSugar的开发框架循序渐进介绍(2)-- 基于中间表的查询处理

    在前面介绍的SqlSugar的相关查询处理操作中,我们主要以单表的方式生成相关的实体类,并在查询的时候,对单表的字段进行条件的对比处理,从而返回对应的数据记录.本篇随笔介绍在一些外键或者中间表的处理中 ...

  4. atitit.基于组件的事件为基础的编程模型--服务器端控件(1)---------服务器端控件和标签之间的关系

    atitit.基于组件的事件为基础的编程模型--服务器端控件(1)---------服务器端控件和标签之间的关系 1. server控件是要server了解了标签.种类型的server控件: 1 1. ...

  5. 基于SqlSugar的开发框架的循序渐进介绍(1)--框架基础类的设计和使用

    在实际项目开发中,我们可能会碰到各种各样的项目环境,有些项目需要一个大而全的整体框架来支撑开发,有些中小项目这需要一些简单便捷的系统框架灵活开发.目前大型一点的框架,可以采用ABP或者ABP VNex ...

  6. ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理

    在前面两篇随笔<ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理>和<ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程>开始 ...

  7. 介绍MFSideMenu左右滑动控件的使用

    昨天刚写完侧滑菜单的实例,今天在CocoaChina网站上看到一篇非常好的侧滑菜单设计案例文章,分享给大家.http://www.cocoachina.com/macdev/uiue/2013/071 ...

  8. 构建基于WinRT的WP8.1 App 03:Page控件

    单页面模板 通常利用Visual Studio 2013创建的最简单的WP8.1应用是Blank App,它只包含一个不带任何UI的页面,并且没有任何状态管理的逻辑. 该不带任何UI的页面称为Blan ...

  9. 基于PtrFrameLayout实现自定义仿京东下拉刷新控件

    前言 最近基于项目需要,使用PtrFrameLayout框架实现了自定义的下拉刷新控件,大体效果类似于京东APP的下拉刷新动态效果.在这里和大家分享一下具体的思路和需要注意的地方,以便帮助有类似开发和 ...

  10. ABP 基于DDD的.NET开发框架 学习(四)时间控件采用datetimepicker注意事项

    $('#datetimepicker1').datetimepicker({ format: 'yyyy/mm/dd hh:ii:ss',//这是只能用小写的大写的与ABP中的字母识别起冲突 loca ...

随机推荐

  1. git rebase简介(高级篇)

    原文:http://gitbook.liuhui998.com/4_3.html 一.基本   对于git rebase,你亦可以选择进行交互式的rebase.这种方法通常用于在向别处推送提交之前对它 ...

  2. Winform开发框架之客户关系管理系统(CRM)的开发总结系列2-基于框架的开发过程

    在上篇随笔<Winform开发框架之客户关系管理系统(CRM)的开发总结系列1-界面功能展示>中介绍了我的整个CRM系统的概貌,本篇继续本系列的文章,介绍如何基于我的<winform ...

  3. Spark1.0.x入门指南

    1 节点说明   IP Role 192.168.1.111 ActiveNameNode 192.168.1.112 StandbyNameNode,Master,Worker 192.168.1. ...

  4. Thinkphp join 连接查询

    public function test ( ) { $User = M('authlist'); $rs = $User->join('left join wifi_shop on wifi_ ...

  5. UE4 保存为bitmap

    TArray<FColor> colorData;    colorData.Init(FColor(0, 0, 255, 255), 1920 * 1080);    for (int ...

  6. Hash冲突解决

    hash的冲突不可避免的 1.开放地址法 开放地执法有一个公式:Hi=(H(key)+di) MOD m i=1,2,-,k(k<=m-1) 其中,m为哈希表的表长.di 是产生冲突的时候的增量 ...

  7. ERROR:scala:Error:Object scala.runtime in compiler mirror not found

    我的项目是sbt项目,今天早晨的时候还好好的,结果中午吃了个饭回来就特么的编译就报错了,真是闹心 报错截图: 解决方案: 删除idea的缓存文件 然后重新启动idea,重新下载jia包,在进行编译,就 ...

  8. Sqlserver 命令行方式修改 用户密码的方法

    1. 之前写了一个 可以使用  ssms 的方式修改密码的情况 2. 还有办法是执行命令 exec sp_password null,'newpassword','sa' # sa 是用户名 newp ...

  9. 自学Python4.3-装饰器固定格式

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  10. 基于TLS的EAP 认证方法

    TLS: transport level security , 安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性.该协议由两层组成: TLS 记录协议(TLS Record)和 TLS ...