Winform软件快速开发平台 - 关于数据权限,表格列权限控制两种解决方案


什么是数据权限?
无论为数据操作赋予怎样的业务含义,其本质上仍然是数据的增删改查操作(如下图)

随着业务的演进,逐渐衍生出精细化管理数据的诉求。我遇到的业务场景是在企业级数据管理中,对不同职级的员工展示不同的数据。我的业务上的诉求是对SELECT进行权限控制,对INSERT、UPDATE、DELETE没有权限限制要求。
CSFramework软件快速开发平台提供两种数据权限解决方案:
一、通过【数据权限的角色】控制表格列的权限
就是定义一系列的角色,每个角色代表一个权限功能。假设我们定义一个【数据角色】Role的编号为:Data-PO, 角色名称:数据权限-采购订单采购价格,此角色用来控制【采购单价】【采购数量】列是否显示。
优点:操作简单,灵活运用,根据用户需求定制开发。
1.1 定义数据权限角色

CSFramework软件快速开发平台中的角色有4种类型:普通角色、系统角色、数据角色、扩展角色。
1.2 给用户分配数据权限角色


1.3 应用测试
原界面:单价、数量列可见。

执行数据权限逻辑控制后数量、单价列不可见:

二、通过【数据权限配置】界面由用户自行配置表格的数据权限
比如用户A限制查看采购订单的【采购单价】及【数量】,可以通过配置界面勾选【单价】【数量】列禁止显示。
优点:操作简单,灵活配置,强大的通用性。

执行数据权限逻辑控制后数量、单价列不可见:

三、使用数据权限、表格权限
3.1 若要支持表格权限,界面必须实现IFormGridPermission接口
C# Code:
/// <summary>
/// 支持配置表格权限的界面
/// </summary>
public interface IFormGridPermission
{
/// <summary>
/// 获取当前界面的表格实例
/// </summary>
/// <returns></returns>
List<GridPermissionItem> GetGrids();
/// <summary>
/// 设置表格权限
/// </summary>
void SetGridsPermission();
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
/// 支持配置表格权限的界面
/// </summary>
public interface IFormGridPermission
{
/// <summary>
/// 获取当前界面的表格实例
/// </summary>
/// <returns></returns>
List<GridPermissionItem> GetGrids();
/// <summary>
/// 设置表格权限
/// </summary>
void SetGridsPermission();
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
3.2 比如采购订单:实现IFormGridPermission接口
C# Code:
public partial class frmPurchaseOrder : Form, IFormGridPermission
{
public frmGridTester()
{
InitializeComponent();
}
//设置主表,明细表表格的权限
public void SetGridsPermission()
{
GridPermissionConfig.SetPermission(gvSummary);
GridPermissionConfig.SetPermission(gvDetail);
}
//获取表格列表,用于配置权限
public List<GridPermissionItem> GetGrids()
{
List<GridPermissionItem> list = new List<GridPermissionItem>();
list.Add(new GridPermissionItem("采购订单主表-模拟测试使用", this.gvSummary));
list.Add(new GridPermissionItem("采购订单明细表-模拟测试使用", this.gvDetail));
return list;
}
//省略代码...
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
{
public frmGridTester()
{
InitializeComponent();
}
//设置主表,明细表表格的权限
public void SetGridsPermission()
{
GridPermissionConfig.SetPermission(gvSummary);
GridPermissionConfig.SetPermission(gvDetail);
}
//获取表格列表,用于配置权限
public List<GridPermissionItem> GetGrids()
{
List<GridPermissionItem> list = new List<GridPermissionItem>();
list.Add(new GridPermissionItem("采购订单主表-模拟测试使用", this.gvSummary));
list.Add(new GridPermissionItem("采购订单明细表-模拟测试使用", this.gvDetail));
return list;
}
//省略代码...
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
3.3 frmGridPermission表格权限配置界面加载表格列表:
C# Code:
/// <summary>
/// 加载表格列表
/// </summary>
private void LoadGrids()
{
//添加当前模块(系统管理模块)的表格实例
_AllGrids.AddRange((new frmDatasetMgr() as IFormGridPermission).GetGrids());
_AllGrids.AddRange((new frmDocNoRule() as IFormGridPermission).GetGrids());
//添加其他模块的表格实例
_AllGrids.AddRange(this.GetModuleGrids("CSFrameworkV5.Report.frmGridTester"));
txtGrids.Properties.DisplayMember = "DisplayName";
txtGrids.Properties.ValueMember = "GridId";
txtGrids.Properties.DataSource = _AllGrids;
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
/// <summary>
/// 加载表格列表
/// </summary>
private void LoadGrids()
{
//添加当前模块(系统管理模块)的表格实例
_AllGrids.AddRange((new frmDatasetMgr() as IFormGridPermission).GetGrids());
_AllGrids.AddRange((new frmDocNoRule() as IFormGridPermission).GetGrids());
//添加其他模块的表格实例
_AllGrids.AddRange(this.GetModuleGrids("CSFrameworkV5.Report.frmGridTester"));
txtGrids.Properties.DisplayMember = "DisplayName";
txtGrids.Properties.ValueMember = "GridId";
txtGrids.Properties.DataSource = _AllGrids;
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
四、C#源码参考
4.1 在Form.Load事件内选择两种解决方案其中一种:
C# Code:
private void frmGridTester_Load(object sender, EventArgs e)
{
//通过【数据权限配置】设置表格列的权限
this.SetGridsPermission();
//通过【数据权限角色】设置表格列的权限
this.SetRolePermission();
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
private void frmGridTester_Load(object sender, EventArgs e)
{
//通过【数据权限配置】设置表格列的权限
this.SetGridsPermission();
//通过【数据权限角色】设置表格列的权限
this.SetRolePermission();
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
4.2 控制表格列是否显示两种方案:
C# Code:
//方案1
//方案1
private void SetRolePermission()
{
//检查当前登录的用户是否拥有特定权限(Data-PO)
bool hasRole = new bllPermission().IsUserBelongRole(Loginer.CurrentUser.Account, "Data-PO");
if (hasRole)
{
//特定角色,隐藏相关列
gvDetail.Columns.Remove(colD_Price);
gvDetail.Columns.Remove(colD_Quantity);
}
}
//方案2
public void SetGridsPermission()
{
GridPermissionConfig.SetPermission(gvSummary);
GridPermissionConfig.SetPermission(gvDetail);
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
{
//检查当前登录的用户是否拥有特定权限(Data-PO)
bool hasRole = new bllPermission().IsUserBelongRole(Loginer.CurrentUser.Account, "Data-PO");
if (hasRole)
{
//特定角色,隐藏相关列
gvDetail.Columns.Remove(colD_Price);
gvDetail.Columns.Remove(colD_Quantity);
}
}
//方案2
public void SetGridsPermission()
{
GridPermissionConfig.SetPermission(gvSummary);
GridPermissionConfig.SetPermission(gvDetail);
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761

扫一扫加微信


版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc C/S框架网