带着上一次笔记的疑问和些许欢喜来到了混混沌沌的下午,程序员的脑子一直在不停的思索着,而多思考总是没错的,盼望着盼望着事情就有了转机,现在我们就来说一说基于角色级别的中间表机制实现行级数据安全.

由于本文大概思路和基于用户级别的中间表机制实现行级数据安全类似,所以在这里就说一说有区别的地方,如果实在有不明白的地方,我想在几十个字前面的链接处给出的文章会给你提供很大的帮助.

1:定义权限标准

和基于用户级别的保持一致.

2:设计基于角色的中间表角色部门表

表(access_role)结构如下图所示

字段解释:roleid来自CJP权限认证的角色表,deptid来自数据仓库中的部门维度表

3:在FM中创建关联关系

--3.1创建事实表和权限标准直接的多对一关系(pdept  1:n  product)

由于和基于用户的操作一样,这里不过多描述

--3.2创建事实表和用户部门表之间的多对一关系(access_role  1:n  product)

由于和基于用户的操作一样,这里不过多描述

--3.3给角色部门表添加过滤器,此步骤很重要

代码解析:#sq(CAMIDList())# contains [physical layer].[ACCESS_ROLE].[ROLEID]

#sq(CAMIDList())#表示利用宏函数获取当前登录用户的所有角色信息并返回,实际内容如下所示

'CAMID("Intrust:u:1"), CAMID("Intrust:r:10000"), CAMID("Intrust:r:10001"), CAMID("::Everyone"), CAMID("::System Administrators"), CAMID("::All Authenticated Users"), CAMID(":Authors"), CAMID(":Query Users"), CAMID(":Consumers"), CAMID(":Metrics Authors"), CAMID(":Metrics Users"), CAMID(":Planning Contributor Users"), CAMID(":Controller Users"), CAMID(":Analysis Users"), CAMID(":PowerPlay Users"), CAMID(":Data Manager Authors"), CAMID(":Readers"), CAMID(":Express Authors"), CAMID(":Adaptive Analytics Users"), CAMID(":Statistics Authors"), CAMID(":Mobile Users"), CAMID(":Cognos Insight Users"), CAMID(":"), CAMID("Intrust")'

返回的是一个字符串,然后我们看再去和access_role中的角色ID比较如果包含则取改行roleid对应的deptid.

经过以上操作,保存模型,发布到cognos connection。

4:在设计报表的查询中添加明细过滤器

[产品认购分析].[部门].[部门].[部门].[部门键]=[physical layer].[ACCESS_ROLE].[DEPTID]

该步骤主要是让角色部门中间表和分析中的部门维度关联起来,实现角色级别的部门ID过滤,然后和部门维度进行关联,这就起到了

只显示和角色相关部门的数据的作用.在以后的管理中我们只要管理好access_role角色和部门之间的关系,给该报表添加数据访问新

用户的时候,在页面维护CJP中的用户角色表,给新用户加上有访问该报表权限的角色即可.如果需要让新角色具有访问该数据的权限,

则需要维护access_role表,结合起来,保证访问权限和数据权限的相对完美实现.

5:查看效果

--5.1可以实现具有不同角色的用户可以访问报表中不同部门的数据

--5.2可以实现修改CJP权限认证中用户角色表来实现给用户增加或者减少访问数据的权限

--5.3可以实现修改access_role来给新角色赋权

PS:需要注意的是,如果用户a具有角色1、角色2, 角色1可以访问部门1的数据,角色2可以访问部门2的数据,则用户a的

访问权限是其所拥有角色权限的并集,即:用户a可以访问部门1和部门2的数据.

6:优缺点分析

--6.1优点

此方法可以保证在以后给该报表增加访问用户或者角色的时候不再修改FM模型即可,增加用户的访问权限维护CJP权限认证中的用户角色表即可,增加角色的访问权限维护

access_role表即可,而且把这种关系扩展到角色和用户的维护符合用户分配权限的习惯.

--6.2缺点

唯一的缺点我想应该是每次设计报表都需要在查询的明细过滤器中加上一个access_role和权限标准表的关联关系,而且从需求完整度上来说,需要维护CJP中的用户角色中间表和access_role两张表,可以这么说比起CJP权限管理来说,我们增加了一个配置表access_role,此表的作用就是建立权限指标表和角色表之间的关系.

--6.3扩展

当然,随着业务的扩展,权限指标可能会多起来,不仅仅局限于部门,也可能是产品类型、所属区域等等,这样的话我们可以考虑在access_role增加一个字段比如下面的结构

当然,这个时候我们可以给表换个名字如下图所示,只是在设计报表的时候多增加一个过滤条件即可 where accesstype=''

FrameWork数据权限浅析3之基于角色的配置表实现行级数据安全的更多相关文章

  1. FrameWork数据权限浅析4之基于多维度配置表实现行级数据安全

    日子过得好苦逼,我过的很好,只是缺少¥.时间在变,而问题始终未变,你解不解决它都在那里一动不动.不知不觉已经发现手机的中央,电脑的右下角已经出现了201411的字样,突然从桌子上爬起来,差点忘记了自己 ...

  2. FrameWork数据权限浅析2之基于用户的配置表实现行级数据安全

    在上一篇笔记中我已经说了如何利用FM自带的机制配合我们已经通过验证的用户空间的组来实现行级数据安全的控制,但是由于上一个方法存在的缺点是以后如果对该对象增加基于用户或者角色的访问权限就需要开发人员去F ...

  3. FrameWork数据权限浅析1之基于手工修改模型实现行级数据安全

    1:环境 Cognos10.2.0,Oracle 2:实现过程 在设置Framework数据级别权限的时候,通常用到的就是在FM的设置数据安全的地方添加安全过滤器,如下图 step1:选中部门维度表→ ...

  4. Transform数据权限浅析2之利用Java完成权限设置

    一:项目背景 1.1:cognos的两种建模工具 为了更好的满足客户的需求,提升报表展现的效率,一种建模工具已经不能满足报表开发和展现的需要.Cognos除了给我们提供了一种基于关系型数据库的建模工具 ...

  5. Transform数据权限浅析1之mdl语句批量加载权限

    Cognos建模工具除了Framework之外,还有一个Transform,两者的最大区别就是在于Framework是通过结构直连关系数据库的,数据根据数据仓库的变化而变化,而Transform是生产 ...

  6. ASP.NET MVC 基于角色的权限控制系统的示例教程

    上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于 ...

  7. ASP.net MVC 基于角色的权限控制系统的实现

    一.引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法. 下面是最常见的实现方式: public class Custom ...

  8. SpringCloud微服务实战——搭建企业级开发框架(二十八):扩展MybatisPlus插件DataPermissionInterceptor实现数据权限控制

    一套完整的系统权限需要支持功能权限和数据权限,前面介绍了系统通过RBAC的权限模型来实现功能的权限控制,这里我们来介绍,通过扩展Mybatis-Plus的插件DataPermissionInterce ...

  9. YIi 权限管理和基于角色的访问控制

    验证和授权(Authentication and Authorization) 定义身份类 (Defining Identity Class) 登录和注销(Login and Logout) 访问控制 ...

随机推荐

  1. AtomicIntegerFieldUpdater用法

    一个基于反射的工具类,它能对指定类的指定的volatile字段进行原子更新 下面是netty源码中AbstractReferenceCountedByteBuf类的使用 private static ...

  2. python 进程间通信(下)

    利用 Value,Array   先说明这个方法并不常用,因为有更灵活的方法 from multiprocessing import Process,Value,Array def f(n,a,not ...

  3. React Native 系列(九)

    前言 本系列是基于React Native版本号0.44.3写的.很多的App都使用了Tab标签组件,例如QQ,微信等等,就是切换不同的选项,显示不同的内容.那么这篇文章将介绍RN中的Tab标签组件. ...

  4. 斐波那契数列(Java实现)

    描述 一个斐波那契序列,F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n>=2),根据n的值,计算斐波那契数F(n),其中0≤n≤1000. 输入 输入 ...

  5. bzoj 4769: 超级贞鱼 -- 归并排序

    4769: 超级贞鱼 Time Limit: 1 Sec  Memory Limit: 128 MB Description 马达加斯加贞鱼是一种神奇的双脚贞鱼,它们把自己的智慧写在脚上——每只贞鱼的 ...

  6. JQ 数组动态添值,对象动态添值,判断数组/对象是否为空

    1.数组动态添值 首先声明一个空数组:var data = new Array(); 向数组中添值 :data.push('添加的值'); 示例:

  7. 使用Spring配置shiro时,自定义Realm中属性无法使用注解注入解决办法

    先来看问题    纠结了几个小时终于找到了问题所在,因为shiro的realm属于Filter,简单说就是初始化realm时,spring还未加载相关业务Bean,那么解决办法就是将springmvc ...

  8. iOS开发之int,NSInteger,NSUInteger,NSNumber的使用

    1.首先先了解下NSNumber类型: 苹果官方文档地址:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/F ...

  9. Spring在bean配置文件中定义电子邮件模板

    在上一篇Spring电子邮件教程,硬编码的所有电子邮件属性和消息的方法体中的内容,这是不实际的,应予以避免.应该考虑在Spring bean 配置文件中定义电子邮件模板. 1.Spring的邮件发件人 ...

  10. Oracle学习(八):处理数据

    1.知识点:能够对比以下的录屏进行阅读 SQL> --SQL语句 SQL> --1. DML语句(Data Manipulation Language 数据操作语言): insert up ...