通用权限管理系统组件 (GPM - General Permissions Manager) 中实现数据列的权限,附源码
2012-02-06 19:30 通用C#系统架构 阅读(4881) 评论(5) 编辑 收藏 举报我们经常需要实现灵活配置数据列的访问权限控制,例如只有某些用户可以看到“开户行,银行帐户,公司税号”等字段,其他用户都不能访问,也不能查看这几个字段,类似的需求在通用权限管理系统里是如何实现的? 我们以图文的方式把主要实现流程讲解给大家。
通用权限里追求的理念是,不依赖某个开发人员尽量能用工具实现,能重复利用,能经得起推敲,函数源码可以重复利用,不管是才C\S, B\S 都可以重复利用的强大函数库,不用总是推倒重来的严格数据库架构,同时还可以兼容多种数据库的目标,打造一个一劳永逸的通用权限管理系统,成为主流各种信息管理系统的核心第3方系统组件,我们不主张去做任何一个项目,但是我们的组件可以用在任何信息化项目里,我们为成千上万的开发商提供服务。
程序的运行效果如下:
这个是通过调用列权限服务的SOA模式调用,然后对界面的表格数据进行一些处理,
1:把表格列过滤为只能访问的列。
2:把可编辑的权限的列进行设置。
3:把拒绝访问的列也可以剔除掉(参考)。
// 这里是当前用户能访问的列名
TableColumnsService tableColumnsService = new TableColumnsService();
string[] accessColumns = tableColumnsService.GetColumns(this.UserInfo, BaseBusinessCardTable.TableName, "Column.Access");
// 设置为只能访问的列
BaseInterfaceLogic.SetColumns(this.grdBusinessCard, accessColumns);
string[] editColumns = tableColumnsService.GetColumns(this.UserInfo, BaseBusinessCardTable.TableName, "Column.Edit");
// 设置为可编辑列
BaseInterfaceLogic.SetEditColumns(this.grdBusinessCard, editColumns);
// 拒绝访问的权限列名获取
string[] deneyColumns = tableColumnsService.GetColumns(this.UserInfo, BaseBusinessCardTable.TableName, "Column.Deney");
BaseInterfaceLogic.RemoveColumns(this.grdBusinessCard, deneyColumns);
这里是控制表格的参考函数
{
for (int i = dataGridView.Columns.Count - 1; i > 0; i--)
{
if (dataGridView.Columns[i].DataPropertyName.Equals("Selected"))
{
break;
}
if (!BaseBusinessLogic.Exists(columns, dataGridView.Columns[i].DataPropertyName))
{
dataGridView.Columns.RemoveAt(i);
}
}
}
public static void SetEditColumns(DataGridView dataGridView, string[] columns)
{
for (int i = 0; i < dataGridView.Columns.Count; i++)
{
if (BaseBusinessLogic.Exists(columns, dataGridView.Columns[i].DataPropertyName))
{
dataGridView.Columns[i].ReadOnly = false;
dataGridView.Columns[i].DefaultCellStyle.BackColor = Color.FromArgb(255, 255, 128);
}
}
}
public static void RemoveColumns(DataGridView dataGridView, string[] columns)
{
for (int i = dataGridView.Columns.Count-1; i >0 ; i--)
{
if (BaseBusinessLogic.Exists(columns, dataGridView.Columns[i].DataPropertyName))
{
dataGridView.Columns.RemoveAt(i);
}
}
}
我们想顺利的实现数据字段的权限,需要进行一下系统性的步骤:
1:首先需要用数据库模型设计工具设计好数据库结构中表结构,需要注意一些常用的关键字字段。
2:下图是每个字段的注释,这些注释可以在设置表字段权限时会派上大用处,不用反复输入基础数据了。
3:我们用代码生成器,进行相关的代码,基础配置数据的生成工作。
3:可以用代码生成器工具直接生成基础数据权限设置的功能,可以节省人工设置的烦恼。
4:运行相关自动生成脚本的效果如下:
5:我们用超级管理员,登录系统进行相关的配置
6:我们设置用户的表字段权限
7:超级管理员可以设置 “公开”列的配置, 然后可以给用户配置相关的数据列权限了。
8:我们可以在获取数据的底层函数里,直接过滤有访问权限的字段,把没有访问权限的字段,直接在底层就进行移除掉,这样系统的安全性会非常高了,可以满足安全要求非常高的信息系统的要求。
文章头部的几个与字段权限有关的函数主要是处理界面效果用的,上图主要是在功能函数的底层直接就把没权限访问的字段排除掉了。
字段权限:
a: 页面上的字段权限实现。
b: 直接在底层就实现字段权限,把数据在底层进行进行筛选处理。
希望以上实现的思路,可以起一些参考意义。