- 浏览: 70095 次
- 性别:
- 来自: 北京
最新评论
本文通过一个使用参数和宏结合实现复杂数据权限需求的案例,分享给大家一个经验:不管多么复杂的数据权限业务逻辑,集智数据平台的报表系统都可以实现。 更多了解各种复杂问题的处理,可以参考:让业务用户随时可以自己定义查询报表、多级部门角色按不同权限查看不同数据。
应用场景说明
某医疗用品制造商使用了润乾集智数据平台来搭建报表管理系统,集智数据平台中用户、组织机构和角色数据保持与客户原有EOS系统数据同步。报表数据从以EOS数据为基础的视图库中抽取。
权限控制涉及到了系统权限和较为复杂的数据权限。系统权限中除了基本的组织机构授权和角色权限以处,还衍生出多种角色权限。比如每一用户都关联了一个权限标志位,而权限标志位又分为普通、部门和全部三种。其中普通权限用户只能看到本人及下级人员数据信息,部门权限用户可以看到本部门内容的数据信息,全部权限用户可以看到全部数据信息,无权限过滤。
但是该单位的销售职位中存在RSM、TSM和TSR三种角色,它们存在上下级关系,职位由高到低依次是RSM、TSM和TSR。并且,TSM有权力跟代理商签订代理协议。TSM可以选择自己跟踪代理协议、分配给TSR跟踪代理协议和自己与TSR同时跟踪代理协议这种跟踪方法。
鉴于以上业务事实,客户提出在相关报表中(设为R)要求实现如下业务逻辑:将R分配给用户后,要求根据“权限标志位”判断出用户能访问的数据范围。同时,当用户登录后,在参数模板中还要求根据sys_UserID筛选出该用户能访问的代理商以及该用户的RSM。RSM的显示规则是:当用户权限标志位为“普通”时,若登录用户为TSR,则显示其上级TSM;若若登录用户为TSM,则显示为自己;若登录用户为RSM,则显示为其下属的所有TSM。当用户权限标志位为“部门”和“全部”时,则按“权限标志位”判断规则显示数据。
实现过程
框架
本实现过程先搭框架,再具体实现,以使读者能够更清晰地理解整个实现过程。
�/SPAN> 查询权限标志位
增加一个参数“mapKey”,使用query()查询并返回权限标志位
�/SPAN> 搭建权限标志位逻辑
Case(mapKey,”普通权限”,”操作1”,”部门权限”,”操作2”,”全部权限操作3”)
�/SPAN> 实现普通权限时操作1
若操作1是查询代理商,则通过sysDistributor、syslicencetsmshare、sysperson和t_user表之间的关联关系查出代理商并返回。
若操作1是查询RSM,则通过syslicencetsmshar、syslicencetsrshare、sysperson和t_user表之间的关联关系查出RSM并返回。
�/SPAN> 实现部门权限时操作2
若操作2是查询代理商,则先通过DistributorAgreement、Distributor、ProductKind和sysperson表之间的关联关系构造出一个含有代理商名称、TSM以及TSM所属部门的视图“DistributorAgreement”。然后从DistributorAgreement查出登录人员所在部门的所有代理商并返回。
若操作2是查询RSM,则通过sysagreement、productdept和rt_roleuser表之间的关联关系查出RSM并返回。
�/SPAN> 实现全部权限时操作3
不进行数据过滤,直接取全量数据即可。
�/SPAN> 将权限标志位逻辑封闭到宏中
将宏结果交给数据集�/SPAN>
实例
在框架基础上,实现实例。
�/SPAN> 查询权限标志位
参数名称 参数类型 值表达式 参数说明
sys_UserID 字符串 集智数据平台传入参数模板的登录用户ID
mapKey 字符串 query2(”mis2datasource”,”select role_id from RT_ROLEUSER where user_id=? and role_id in (3,4,5)”,@sys_UserID) 权限标志位
�/SPAN> 搭建权限标志位逻辑
Case(mapKey,”普通权限”,”操作1”,”部门权限”,”操作2”,”全部权限操作3”)
�/SPAN> 实现普通权限时操作1
若操作1是查询代理商,则:
select DistributorName_C as 代理商中文名称 from sysDistributor where DistributorID in (select distinct DistributorID from syslicencetsmshare where personid in (select personid from sysperson where personname in (select user_name from sjmreport.dbo.t_user where user_id = ‘”+sys_UserID+”‘))) order by DistributorName_C
若操作1是查询RSM,则增加一个参数dmgr,以判断登录用户是否是TSM,若返回值为0,说明是TSR,否则为TSM。参数及相关业务逻辑如下:
参数名称 参数类型 值表达式 参数说明
dmgr 整数 query2(”eosreport”,”select count(*) from syslicencetsmshare where personid in (select personid from sysperson where personname in (select user_name from sjmreport.dbo.t_user where user_id = ?))”,@sys_UserID) 判断登录用户是否是TSM,若返回值为0,说明是TSR,否则为TSM
if(dmgr>=1,”select user_name as 经理名 from sjmreport.dbo.t_user where user_id = ‘”+sys_UserID+”‘”,”select personname as 经理名 from sysperson where personid in(select personid from syslicencetsmshare where pk_lictsmshare in(select pk_lictsmshare from syslicencetsrshare where personid in(select personid from sysperson where personname in(select user_name from sjmreport.dbo.t_user where user_id = ‘”+sys_UserID+”‘))))”)
�/SPAN> 实现部门权限时操作2
若操作2是查询代理商,则:
SELECT 代理商中文名称 FROM sysagreement where 部门 in(select role_name from sjmreport.dbo.t_role where role_id in(select role_id from sjmreport.dbo.rt_roleuser where user_id=’”+sys_UserID+”‘ and role_id in (22,23,24,25,26,27)))
若操作2是查询RSM,则:
select distinct 区域销售经理 as 经理名 from sysagreement where 部门 in(SELECT 部门代码 FROM productdept where 部门ID in(select role_id-21 from sjmreport.dbo.rt_roleuser where user_id=’”+sys_UserID+”‘ and role_id in (22,23,24,25,26,27)))
�/SPAN> 实现全部权限时操作3
若操作2是查询代理商,则:
select DistributorName_C as 代理商中文名称 from sysDistributor where DistributorID in (select distinct DistributorID from syslicencetsmshare) order by DistributorName_C
若操作2是查询RSM,则:
select distinct 区域销售经理 as 经理名 from sysagreement
�/SPAN> 将权限标志位逻辑封闭到宏中
宏名称 类型 值表达式
代理商 动态宏 case(mapKey, “3″,”select DistributorName_C as 代理商中文名称 from sysDistributor where DistributorID in (select distinct DistributorID from syslicencetsmshare where personid in (select personid from sysperson where personname in (select user_name from sjmreport.dbo.t_user where user_id = ‘”+sys_UserID+”‘))) order by DistributorName_C”,”4″,”SELECT 代理商中文名称 FROM sysagreement where 部门 in(select role_name from sjmreport.dbo.t_role where role_id in(select role_id from sjmreport.dbo.rt_roleuser where user_id=’”+sys_UserID+”‘ and role_id in (22,23,24,25,26,27)))”,”select DistributorName_C as 代理商中文名称 from sysDistributor where DistributorID in (select distinct DistributorID from syslicencetsmshare) order by DistributorName_C”)
TSM 动态宏 case(mapKey, “3″,if(dmgr>=1,”select user_name as 经理名 from sjmreport.dbo.t_user where user_id = ‘”+sys_UserID+”‘”,”select personname as 经理名 from sysperson where personid in(select personid from syslicencetsmshare where pk_lictsmshare in(select pk_lictsmshare from syslicencetsrshare where personid in(select personid from sysperson where personname in(select user_name from sjmreport.dbo.t_user where user_id = ‘”+sys_UserID+”‘))))”),”4″,”select distinct 区域销售经理 as 经理名 from sysagreement where 部门 in(SELECT 部门代码 FROM productdept where 部门ID in(select role_id-21 from sjmreport.dbo.rt_roleuser where user_id=’”+sys_UserID+”‘ and role_id in (22,23,24,25,26,27)))”,”select distinct 区域销售经理 as 经理名 from sysagreement”)
�/SPAN> 将宏结果交给数据集
将“代理商”和“TSM”使用复杂SQL数据集封闭即可。
总结
以上实现案例仅是针对在参数模板中进行数据权限控制的情况。当参数模板中数据传递到报表模板时还需要针对入参匹配数据,真正实现数据权限控制。不过,相对此过程参数模板中的控制就简单多了,不此不再实现。
实现以上业务逻辑也实属无奈。当集智数据平台与其它系统共享库表,集智数据平台业务数据结构必须依赖于共享库表时,该案例还是有一定的借鉴意义。
这种实现方案能避免就尽量避免,不能避免时,也要相信集智数据平台的报表系统能够很好地解决的。
发表评论
-
RBP系统管理之日志管理
2011-09-26 22:57 876RBP的系统管理中设置了日志管理,通过『日志管理』功能模块 ... -
RBP中新增自由格式报表资源之自由格式风格
2011-09-26 22:19 881RBP的资源中心模块提供了新建资源的自由格式报表功能, ... -
决策分析平台(RBP)在weblogic8.1下的部署
2011-09-15 21:40 895润乾决策分析平台(简 ... -
润乾决策分析平台(RBP)功能模块介绍
2011-09-15 21:34 929润乾决策分析平台,简称RBP,英文全称为RAQ Busines ... -
决策分析平台(RBP)在tomcat下的部署
2011-09-15 21:26 1022润乾决策分析平台(简称RBP)是面向企业级应用的决策分析解决方 ... -
RBP系统管理之服务器参数管理
2011-09-15 21:18 827<p> </p> <p styl ... -
RBP系统管理之用户审批
2011-09-15 21:10 917RBP的系统管理中包括组织机构管理、业务角色管理、系统用 ... -
RBP系统管理之地区管理
2011-09-15 20:58 879RBP的系统管理中包括 ... -
RBP系统管理之系统用户管理
2011-09-15 20:46 821RBP的系统管理中包括组织机构管理、业务角色管理、系统用 ... -
RBP的个人信息管理与个人资料
2011-09-15 20:41 685RBP提供了个人信息管理和个人资料查看功能。下面就简单介 ... -
RBP中的密码规则与口令加解密参数
2011-09-15 20:29 941RBP的系统管理中提供 ... -
RBP系统管理之业务角色管理
2011-09-15 20:21 1157RBP的系统管理中包括 ... -
RBP系统管理之组织机构管理
2011-09-15 20:05 801RBP的系统管理中包括 ... -
润乾决策分析平台(RBP)用户授权机制介绍
2011-09-15 19:57 709润乾决策分析 平台(RBP)是面向企业端报表需要的客户提 ... -
RBP的参数配置文件reportConfig.xml介绍
2011-09-15 19:50 1226润乾决策分析 平台(RBP)的应用包reportmis/ ... -
基于API导出带有页眉页脚的excel
2011-08-30 23:07 1498Posted in 集智 集智数据平台报表中设置的页眉 ... -
集智数据平台两种数据源连接的配置方式
2011-08-30 22:44 788在集智数据平台中提供了两种数据源连接的配置方式,均通过repo ... -
润乾导出WPS office文档格式的说明
2011-08-26 23:05 931针对microsoft office的文档格式,WPS off ... -
.Excel进行数据转换后执行导入
2011-08-26 22:59 1015润乾报表提供了强大 ... -
在填报表中如何正确使用自动增长的字段
2011-08-26 22:43 692在多用户并发进行填报的时候,总会遇到一个发生率很高的问题,就是 ...
相关推荐
本文将深入探讨函数参数和宏参数的区别及其在使用中的特点。 首先,我们来看函数参数。在C语言中,函数参数分为形式参数(形参)和实际参数(实参)。形参是函数定义时声明的变量,它们在函数体内可用,但超出函数...
宏支持参数化,这意味着在使用宏时,可以根据实际需求调整参数,如电压、电流等,使得设计更加灵活。 在EPLAN P8中,宏不仅可以用于绘制电路图,还可以应用于报表生成、项目结构规划等方面。通过宏,可以实现设计...
每个部件都包含了详细的属性信息,如技术参数、供应商信息、3D模型等,使得设计者可以快速、准确地插入和配置所需的电气元件。Eplan提供的“厂商部件库”是预设的、由各个设备制造商提供的标准部件集合,设计者可以...
内联函数和宏在C++编程语言中是两种常见的代码优化技术,它们都可以用来替代函数调用,以减少函数调用带来的开销。然而,两者在实现方式、编译过程和功能特性上有着显著的区别。 首先,我们来看内联函数。内联函数...
1. **学习资源**:SourceInsight的官方文档是了解其功能和宏编程的首选资料,同时,网络上也有许多教程和社区分享的技巧。 2. **实践应用**:通过实际操作,如设置个性化快捷键、创建和调试宏,来熟悉SourceInsight...
Fanuc机器人宏指令和宏启动是其编程系统中的重要特性,能够极大提高工作效率和程序的灵活性。宏定义是将一系列程序指令打包成一个独立的指令,便于调用和执行。宏指令可以在不同场景下启动,包括程序内部调用、手动...
根据手册页第5部分标准、环境和宏.pdf中的描述,这个软件和相关文档是根据许可协议提供的,包括使用和披露的限制,并受到知识产权法律的保护。用户不能使用、复制、再现、翻译、广播、修改、许可、传输、分布、展示...
开关电源明纬部件库和宏.edz
### C语言文件操作、预处理器和宏课件知识点解析 #### 文件操作 ##### 打开文件 在C语言中,`fopen`函数用于打开一个文件。它接收两个参数:第一个参数是要打开的文件名(通常为字符串),第二个参数是打开方式。...
本文将深入探讨"Eplan—ABB部件库和宏"这一主题,旨在帮助用户更好地理解和利用这些资源来提升其在Eplan中的设计效率。 首先,让我们了解什么是部件库。部件库是Eplan的核心组成部分之一,它包含了各种电气元件的...
对于参数化的宏定义,建议在宏定义中使用括号来确保正确的运算顺序: ```c #define SUM(x, y) ((x) + (y)) ``` 如果不使用括号,可能会导致意外的结果。例如,以下宏定义可能导致错误的行为: ```c #define CUBE...
- **参数传递**:xlwings支持参数的双向传递,允许从Excel传递值到Python函数,并将结果返回到Excel。 - **类型转换**:xlwings会自动处理数据类型转换,如将Excel的字符串转换为Python的字符串,数字等。 - **...
用户在Eplan P8中导入这些文件后,可以直接使用其中的部件和宏,无需从头开始创建。导入过程通常包括选择正确的文件,然后在软件内进行相应的设置,使得库和宏能够被识别和应用到设计项目中。 为了充分利用这些资源...
### C++中的宏、内联函数和宏的比较 在C++编程中,宏和内联函数是提高代码效率和可读性的两种常见方法。它们各自有着不同的应用场景和特点,了解这些差异对于编写高质量的C++代码至关重要。 #### 宏(Macro) 宏...
- 步骤1:创建变量和宏,定义模型的关键参数和操作序列。 - 步骤2:将变量分配给Patran的具体操作,如几何修改、网格划分等。 - 步骤3:定义期望的分析结果作为输出变量,这些变量将包含在分析中的关键信息。 - ...
参数的使用使得宏更加灵活,能够接受不同输入并产生相应的输出。宏中的标号处理则允许在宏体内定义局部标号,避免了全局标号冲突的问题。宏嵌套允许在一个宏定义中调用另一个宏,增加代码的复用性。而宏与子程序的...
在Microsoft Win32 API编程中,消息、结构和宏是构建Windows应用程序不可或缺的元素。本文将深入探讨这些关键概念,帮助你成为一名精通Win32 API的程序员。 首先,我们来了解**消息(Message)**。在Windows操作系统...
例如,使用Promise可以更好地组织异步代码,使得代码更加清晰和易于维护。 总的来说,"12. code微任务和宏任务"的学习资源将深入讲解JavaScript的异步模型,帮助开发者掌握如何更有效地管理异步操作,提高代码性能...