如何在应用系统中实现数据权限的控制功能

如何在应用系统中实现数据权限的控制功能~

  在很多应用行业里面,都对数据的权限做了特别的声明,如对于销售,财务的数据,它们是非常敏感的,因此要求对数据权限进行控制,对于基于集团性的应用系统而言,就更多需要控制好各自公司的数据了。如默认只能看本公司、或者本部门的数据,对于特殊的领导,可能需要跨部门的数据,因此不能硬编码那个领导该访问哪些数据,需要进行后台的权限和数据权限的控制为佳。
  1)对角色功能权限进行设置

  2)对角色数据权限进行控制

  当对角色的数据权限进行保存后,我们就可以把这个角色能够访问的组织机构(公司、部门、工作组等等)进行记录起来了。
  2)应用系统的集成,实现数据权限的控制
  如我的一个病人资料应用系统,客户要求就是基于互联网的应用系统,因此使用WCF数据通讯模式实现数据的集中管理,而且他们要基于医院单位的数据管理模式,也就是每个单位管理各自的数据,我们可以把不同的医院单位作为不同的公司性质来区分,这样在权限模块中进行设置即可。
  1)在应用程序中,通过在程序头部,让可以管理多个医院机构的用户选择管理的数据访问,即可实现不同的数据区分管理。

  2)当用户在上面切换不同的机构,所有存在的界面数据全部实现刷新,如打开了很多界面,那么这些界面的数据也随之更新为对应新的机构下的数据。转载,仅供参考。

给角色配链接,在给用户配角色。5张表。连接表resource,角色表role,用户表user,两张中间表:roleResource(两个属性分别外键关联resources和role的id),userRole(关联user和role的id)。

对数据进行控制最好通过弹性的方式,在一个系统里面或者功能模块里面对用户角色或者岗位进行设置,一般权限控制默认在一个权限管理系统模块进行设定,数据权限也应该如此。
权限系统除了可以对用户能操作那些功能进行限定,也还可以对其访问那些组织机构的数据进行限定,我们通过权限系统,把这些权限控制的数据进行保存,在应用系统模块里面进行整合即可,根据角色拥有的数据权限,授予用户对其他部门或者机构的数据进行访问。如下面是我权限系统模块里面对角色权限的设置操作。
1)对角色功能权限进行设置

2)对角色数据权限进行控制

当对角色的数据权限进行保存后,我们就可以把这个角色能够访问的组织机构(公司、部门、工作组等等)进行记录起来了。
2)应用系统的集成,实现数据权限的控制
如我的一个病人资料应用系统,客户要求就是基于互联网的应用系统,因此使用WCF数据通讯模式实现数据的集中管理,而且他们要基于医院单位的数据管理模式,也就是每个单位管理各自的数据,我们可以把不同的医院单位作为不同的公司性质来区分,这样在权限模块中进行设置即可。
1)在应用程序中,通过在程序头部,让可以管理多个医院机构的用户选择管理的数据访问,即可实现不同的数据区分管理。

2)当用户在上面切换不同的机构,所有存在的界面数据全部实现刷新,如打开了很多界面,那么这些界面的数据也随之更新为对应新的机构下的数据。
了解了上面大致的需求,我们应该如何通过整合权限管理系统实现在应用系统的数据权限控制和集成呢?
首先我们需要在用户登陆的时候,获取对应用户的数据权限内容,然后把它转化为我们需要的信息,如下代码所示。

//判断如果用户管理的公司数据多于两个,那么就显示选择单位列表,并绑定公司数据
List<RoleDataInfo> roleDataList = CallerFactory<IRoleDataService>.Instance.FindByUser(info.ID);
List<int> companyList = new List<int>();
foreach (RoleDataInfo roleDataInfo in roleDataList)
{
if (!string.IsNullOrEmpty(roleDataInfo.BelongCompanys))
{
string[] companyArray = roleDataInfo.BelongCompanys.Split(',');
foreach (string company in companyArray)
{
if (!string.IsNullOrEmpty(company) && ValidateUtil.IsNumber(company.Trim()))
{
if (!companyList.Contains(company.ToInt32()))
{
companyList.Add(company.ToInt32());
}
}
}
}
}
Portal.gc.CompanyList = companyList;

//设置选定的公司ID
Cache.Instance["SelectedCompanyID"] = info.Company_ID;
//设置过滤条件给界面基类使用
Cache.Instance["DataFilterCondition"] = string.Format(" (Company_ID is null OR Company_ID = '{0}')", info.Company_ID);

其中CallerFactory方式调用,是以WCF的方式获取对应的数据库数据。在上面代码里面,有一个RoleDataInfo的实体类,这个就是用来承载用户角色的数据权限数据,其中包括了
BelongCompanys(所属公司)和 BelongDepts(所属部门 )的属性,我们把它解析为我需要的数据List<int> companyList 、 SelectedCompanyID 和 DataFilterCondition,当然如果有部门的控制,可以做的更多,我这里仅仅以医院机构进行区分即可。
SelectedCompanyID 就是用户选择查看的组织机构ID,DataFilterCondition就是用来构建一个数据过滤脚本,对用户看到的数据进行一个过滤筛选作用。我们把这两个数据内容,放到Winform的缓存里面,如果是Web可以用Session代替,这样可以在多个模块或者界面中方便访问使用。
为了实现用户选择不同的机构,所有打开的窗体数据实现相应的更新,那么我们需要处理公司选择的操作,具体实现代码如下所示。

private void txtCompany_EditValueChanged(object sender, EventArgs e)
{
//如果用户选择公司,以选择为主,否则以当前客户所在公司
if (this.txtCompany.EditValue != null)
{
CListItem item = this.txtCompany.EditValue as CListItem;
if (item != null)
{
//设置选定的公司ID
Cache.Instance["SelectedCompanyID"] = item.Value;
SetSelectedCompanyName();

//设置过滤条件给界面基类使用
string condition = string.Format(" Company_ID = '{0}'", item.Value);
Cache.Instance["DataFilterCondition"] = condition;

//遍历全部窗口,更新
foreach (WHC.Framework.BaseUI.BaseDock form in this.MdiChildren)
{
form.SelectedCompanyID = item.Value;
form.DataFilterCondition = condition;
form.FormOnLoad();
}

string message = string.Format("您已经切换数据显示:{0}", item.Text);
MessageDxUtil.ShowTips(message);
}
}
}

上面是对所有打开的窗体,传递了对应的信息,然后进行了刷新。那么我们在看看窗体本身内部的数据显示逻辑是如何的。
我们以病人资料的查询界面为例,根据不同的输入条件,对数据进行不同查询外,还增加了一个对组织机构过滤的条件,如下所示。

/// <summary>
/// 根据查询条件构造查询语句
/// </summary>
private string GetConditionSql()
{
//如果存在高级查询对象信息,则使用高级查询条件,否则使用主表条件查询
SearchCondition condition = advanceCondition;
if (condition == null)
{
condition = new SearchCondition();
condition.AddCondition("BedNo", this.txtBedNo.Text.Trim(), SqlOperator.Like);
condition.AddCondition("TumorPart", this.txtTumorPart.Text.Trim(), SqlOperator.Like);
........................
condition.AddDateCondition("InDate", this.txtInDate, this.txtInDateEnd);
condition.AddDateCondition("LeaveDate", this.txtLeaveDate, this.txtLeaveDateEnd);if (this.chkHasReferral.Checked)
{
condition.AddCondition("HasReferral", "是", SqlOperator.Equal, true);
}
...................
}

string where = condition.BuildConditionSql().Replace("Where", "");

//如果公司过滤条件不为空,那么需要进行过滤
if (!string.IsNullOrEmpty(this.DataFilterCondition))
{
where += string.Format(" AND {0}", this.DataFilterCondition);
}

return where;
}

/// <summary>
/// 绑定列表数据
/// </summary>
private void BindData()
{
//entity
this.winGridViewPager1.DisplayColumns = "HandNo,BedNo,MidVideo,Name,Sex,IdentityCard,Age,Birthday,HospitalNo,IDNumber,InDate,InDiagnosis,SurgeryDate,DirectorSurgeon,LeaveDate,TumorPart,LeaveDiagnosis,IsFirstTime,LeaveSpecimens,OuterFilm,PreMRI,PreCT,PrePicture,MidPathology,AfterCTMRI,AfterPicture,AfterVideo,LeavePicture,Endocrine,Professor,Address,Telephone,HasReferral,ReferralDate,ReferralTime,Pathology,Note,Report";
this.winGridViewPager1.ColumnNameAlias = CallerFactory<IPatientService>.Instance.GetColumnNameAlias();//字段列显示名称转义

string where = GetConditionSql();
PagerInfo pagerInfo = this.winGridViewPager1.PagerInfo;
List<PatientInfo> list = CallerFactory<IPatientService>.Instance.FindWithPager(where, ref pagerInfo);
this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<PatientInfo>(list);
this.winGridViewPager1.PrintTitle = "病人基本资料信息报表";
}

以上绑定代码实现了:分页、条件查询、高级查询、字段列表显示、中文名称转义,以及最重要的,根据公司条件进行数据过滤的操作,从而让用户只能管理自己的数据。

数据权限控制的最佳实践
答:我们通过权限系统,把这些权限控制的数据进行保存,在应用系统模块里面进行整合即可,根据角色拥有的数据权限,授予用户对其他部门或者机构的数据进行访问。组织机构的数据管理当对角色的数据权限进行保存后,我们就可以把这个角色能够访问的组织机构(公司、部门、工作组等等)进行记录起来了。数据权限的控制如我的一个病...

如何在应用系统中实现数据权限的控制功能
答:在RBAC之中,包含用户users(USERS)、角色roles(ROLES)、目标objects(OBS)、操作operations(OPS)、许可权permissions(PRMS)五个基本数据元素,权限被赋予角色,而不是用户,当一个角色被指定给一个用户时,此用户就拥有了该角色所包含的权限。会话sessions是用户与激活的角色集合之间的映射。RBAC0与传统访问控制的差别在于增...

华为手机上不了网?这些方法或许能帮到你
答:华为nova7Pro支持应用权限管理,你可以打开手机设置,点击“应用”选项,对每个APP的权限进行个性化设置。☁️云空间备份华为nova7Pro具备云空间功能,登录华为账号后,你可以将通讯录、图库等重要数据备份到云端,以防止数据丢失。打开系统设置页面,点击华为账号,选择云空间进行备份操作。‍开发者模式如果你需要使用...

微信无法获取摄像头数据是怎么回事 微信无法获取摄像头数据怎么办
答:因为你没有在系统设置里,允许微信可以使用相机,所以微信无法获取摄像头数据。关于如何获取,我分享一下方法给你看看。以手机型号:vivo y31s为例。 具体的步骤如下: 1.打开手机上的设置,接着点击下方的【应用与权限】。 2.然后点击【权限管理】。 3.接着点击右边的【权限】,再点击下方的【使用摄像头】。 4.进...

权限设置:保障数据安全,优化工作流程
答:权限设置:保障数据安全,优化工作流程权限设置,是一种对特定领域里某些人访问进行限制的方法。在公司的网络系统中,通过设置权限,可以确保不同级别的员工只能访问他们应该看到的资源,比如数据库或文件夹。这样做

vivo手机的权限管理怎么设置?
答:Funtouch OS 3.0 及以上系统机型:1、进入设置-更多设置-权限管理中设置应用的权限(如:访问联系人、录音权限);2、进入i管家-权限管理中可以设置应用的权限(如:访问联系人、录音权限);Funtouch OS 3.0 以下系统机型:进入i管家-软件管理-软件权限管理中,即可设置软件的软权限(如:访问联系人...

软件无法正常读取配置文件的原因及解决方法
答:在使用软件的过程中,有时候会遇到无法正常读取配置文件的情况,导致软件无法正常工作。那么,为什么会出现这种情况呢?配置文件路径不正确软件读取配置文件时,需要确定配置文件所在的路径。如果路径不正确,软件就无法找到配置文件,也就无法读取配置文件中的内容。配置文件路径可以在程序中进行设置,也可以在系统环境变量中进...

VIVO软件无联网权限,请在AndroidManifest.xml内配置!怎么弄?
答:可以参考设置软件联网权限的方法:1、进入i管家--流量管理/更多工具--联网管理--点击软件后面图标--显示红色“/或X”,即代表限制软件连接当前的网络。2、进入原子隐私系统--安全设置--权限控制--点击WiFi和数据网络开关,可设置原子隐私系统内的软件联网开关。注:部分内置系统软件,如:“i管家”,为...

crm系统里怎么进行用户和权限设置?
答:在【系统设置】->【用户和权限】->【组织架构管理】中,组织架构分为部门和岗位,创建完整的组织架构,需要先添加部门,然后在部门下添加岗位,最后在岗位中添加系统用户并授权。在部门管理中,点击设置,可以新建下级部门,编辑和删除现有部门,编辑部门时,可以移动现有部门所在的位置。添加完部门之后,就...

华为使用情况访问权限
答:应用在使用时可能需要获取一些数据和访问权限,例如获取位置信息、悬浮窗权限等,以便为您提供相应的服务。但部分应用也可能会获取过多不必要的权限,存在隐私安全和信息泄露的风险。您可以查看各应用的权限,关闭不合理的权限。管理应用获取位置信息的权限 当授权某个应用获取您的位置信息权限后,此应用将可...

IT评价网,数码产品家用电器电子设备等点评来自于网友使用感受交流,不对其内容作任何保证

联系反馈
Copyright© IT评价网