一:项目背景

1.1:cognos的两种建模工具

为了更好的满足客户的需求,提升报表展现的效率,一种建模工具已经不能满足报表开发和展现的需要。Cognos除了给我们提供了一种基于关系型数据库的建模工具Framework之外,还为我们提供了另外一种基于立方体数据的建模工具Transform。这种工具可以生产cube立方体,用户可以直接从立方体读取数据。

1.2:利用Javaproject来维护cube安全的必要性

有数据就要有安全,通常给cube设置安全就是通过在cube下面创建custom view ,然后控制custom view的权限,然后在视图里面添加角色和用户,这样角色和用户就具有了custom view的权限。但是随着分析类型和需求的增加,cube数量会多起来,用户会多起来,角色会多起来,不同角色之间的权限关系也会多起来,我们如果每次更改就需要手动的打开Transform去更改视图,这样维护起来就会很繁琐,这个时候就需要一个程序去帮我们处理这个事情,于是开发一个利用Java来修改cube权限的project就显的十分重要.

二:实现原理

2.1:可执行操作

l  Java可以修改可执行mdl文件

l  利用Transform打开可执行mdl文件可以完成修改指定mdl模型权限的操作

l  window批处理(.bat文件)可以调用cogtr.exe打开可执行文件并且重新生产cube

2.2:操作原理流程图

三:技术相关

3.1:数据库

数据库采用Oracle数据库,数据库操作工具PLSQL

3.2:开发工具与语言

开发工具MyEclipse 8.5  Enterprice,Java

3.3:涉及到的开发技术

JavaBean、struts2、Jquery、Ajax、Jsp

四:开发详细步骤

4.1:相关配置表详解

相关表对象的出场顺序将按照Java Project中使用到的先后顺序出场,下面列出的表都是在项目中不可缺少的,表名字根据自己的喜好来,最主要的是相关表结构.其中模型信息表Cognos认证角色表数据安全授权表维度名称表是程序必须的表,区域维度表是数据仓库中的一个维度表,具体操作的时候换成具体场景中的三级以内的维度表即可

4.1.1:模型信息表

4.1.1.1表作用

保存BI项目开发中的所有cube信息,开发好后的模型文件路径,对应可执行文件的路径,生产的cube名称,以及需要添加权限的相关维度,批处理文件路径,对应的Cognos第三方认证空间id,名称等信息

4.1.1.2表结构

  1. -- Create table
  2.  
  3. create table TRANSFORMMODEL
  4.  
  5. (
  6.  
  7. modelid NUMBER,
  8.  
  9. modelname NVARCHAR2(),
  10.  
  11. modelpath NVARCHAR2(),
  12.  
  13. modeldimension NVARCHAR2(),
  14.  
  15. modelupdatefile NVARCHAR2(),
  16.  
  17. namespaceid NVARCHAR2(),
  18.  
  19. namespacename NVARCHAR2(),
  20.  
  21. batpath NVARCHAR2()
  22.  
  23. )
  24.  
  25. tablespace TBS_COGNOS
  26.  
  27. pctfree
  28.  
  29. initrans
  30.  
  31. maxtrans
  32.  
  33. storage
  34.  
  35. (
  36.  
  37. initial 64K
  38.  
  39. next 8K
  40.  
  41. minextents
  42.  
  43. maxextents unlimited
  44.  
  45. );
  46.  
  47. -- Add comments to the columns
  48.  
  49. comment on column TRANSFORMMODEL.modelid
  50.  
  51. is '模型id,主键';
  52.  
  53. comment on column TRANSFORMMODEL.modelname
  54.  
  55. is '模型名称,和模型中cube名称保持一致';
  56.  
  57. comment on column TRANSFORMMODEL.modelpath
  58.  
  59. is '模型在服务器上的绝对路径';
  60.  
  61. comment on column TRANSFORMMODEL.modeldimension
  62.  
  63. is '模型权限相关的维度表名称,可以是一个表,也可以是多个表,
  64.  
  65. 多个表之间用逗号隔开如(pdept,ptype),如果为空表示cube不设置
  66.  
  67. 相关数据权限,如果有维度表,则表示此cube在此维度上面做了权限控制.';
  68.  
  69. comment on column TRANSFORMMODEL.modelupdatefile
  70.  
  71. is '模型对应的可执行文件,执行打开此文件的操作去修改模型文件的相关权限';
  72.  
  73. comment on column TRANSFORMMODEL.namespaceid
  74.  
  75. is '模型所引用的用户空间id(Cognos第三方名称空间id)';
  76.  
  77. comment on column TRANSFORMMODEL.namespacename
  78.  
  79. is '模型所引用的用户空间名称(Cognos第三方名称空间名称)';
  80.  
  81. comment on column TRANSFORMMODEL.batpath
  82.  
  83. is '执行打开可执行文件并且生成cube的bat批处理文件的所在路径';

4.1.1.3数据展示

4.1.2:cognos认证角色表

4.1.2.1表作用

保存Cognos第三方认证时候的角色信息,BI项目采用的是CJAP认证方式

4.1.2.2表结构

  1. -- Create table
  2.  
  3. create table ORG_ROLE
  4.  
  5. (
  6.  
  7. role_id VARCHAR2(),
  8.  
  9. role_code VARCHAR2(),
  10.  
  11. role_name VARCHAR2()
  12.  
  13. )
  14.  
  15. tablespace TBS_COGNOS
  16.  
  17. pctfree
  18.  
  19. initrans
  20.  
  21. maxtrans
  22.  
  23. storage
  24.  
  25. (
  26.  
  27. initial 64K
  28.  
  29. next 8K
  30.  
  31. minextents
  32.  
  33. maxextents unlimited
  34.  
  35. );
  36.  
  37. -- Add comments to the columns
  38.  
  39. comment on column ORG_ROLE.role_id
  40.  
  41. is '角色id';
  42.  
  43. comment on column ORG_ROLE.role_code
  44.  
  45. is '角色英文代码';
  46.  
  47. comment on column ORG_ROLE.role_name
  48.  
  49. is '角色中文名称';

4.1.2.3数据展示

4.1.3:数据安全授权表

4.1.3.1表作用

存储角色和数据仓库中维度表之间的授权关系,该表中配置的维度表个数和模型信息表中modeldimension 字段包含的维度表个数保持一致,cube开发过程中就应该在该表中设计角色和维度直接的授权关系,即什么角色可以访问什么维度值.

4.1.3.2表结构

  1. -- Create table
  2.  
  3. create table ACCESS_TABLE
  4.  
  5. (
  6.  
  7. roleid NUMBER,
  8.  
  9. accesstype NVARCHAR2(),
  10.  
  11. accessid_1 NUMBER,
  12.  
  13. accessid_2 NUMBER,
  14.  
  15. accessid_3 NUMBER
  16.  
  17. )
  18.  
  19. tablespace TBS_COGNOS
  20.  
  21. pctfree
  22.  
  23. initrans
  24.  
  25. maxtrans
  26.  
  27. storage
  28.  
  29. (
  30.  
  31. initial 64K
  32.  
  33. next 8K
  34.  
  35. minextents
  36.  
  37. maxextents unlimited
  38.  
  39. );
  40.  
  41. -- Add comments to the columns
  42.  
  43. comment on column ACCESS_TABLE.roleid
  44.  
  45. is '角色id';
  46.  
  47. comment on column ACCESS_TABLE.accesstype
  48.  
  49. is '授权维度表的中文名称,相对的表名称可以在DIMENSION_NAME中找到';
  50.  
  51. comment on column ACCESS_TABLE.accessid_1
  52.  
  53. is '一、二、三级维表的第一级';
  54.  
  55. comment on column ACCESS_TABLE.accessid_2
  56.  
  57. is '一、二、三级维表的第二级';
  58.  
  59. comment on column ACCESS_TABLE.accessid_3
  60.  
  61. is '一、二、三级维表的第三级';

4.1.3.3数据展示

需要注意的是,当前授权表access_table只能满足最多三级维度的权限配置,如果维度级别增加,请参照下面的结构增加accessid_n即可.

不管维度表有多少级,请保证一个roleid的行只能有一个accessid_n字段有值,因为既一级维度就对应一个值,多级维度的话如果给角色赋予了高等级的权限就不需要再给低等级的权限,同理如果要给低等级的同时就不能再给高等级的权限

a:如果维度表是一级维度,一个roleid对应的accessid_1、accessid_2、accessid_3只能是accessid_1有值,accessid_2、accessid_3一定都为空,当然一个roleid可以有多行值。

b:如果维度表是二级维度,一个roleid对应的accessid_1、accessid_2、accessid_3只能是accessid_1或者accessid_2有值,当然一个roleid可以有多行值

c:如果维度表是三级维度,一个roleid对应的accessid_1、accessid_2、accessid_3只能是accessid_1或者accessid_2或者accessid_3有值,当然一个roleid可以有多行值

4.1.4:维度名称表

4.1.4.1表作用

保存所有维度表英文名字对应的中文名称,方便在创建mdl文件的时候可以根据英文或者中文表名很方便的找到对应的翻译名称,这里的中文名称保持和模型中维度名称一致.

4.1.4.2表结构

  1. -- Create table
  2.  
  3. create table DIMENSION_NAME
  4.  
  5. (
  6.  
  7. dimensionkey NUMBER,
  8.  
  9. dimensionen NVARCHAR2(),
  10.  
  11. dimensionch NVARCHAR2()
  12.  
  13. )
  14.  
  15. tablespace TBS_COGNOS
  16.  
  17. pctfree
  18.  
  19. initrans
  20.  
  21. maxtrans
  22.  
  23. storage
  24.  
  25. (
  26.  
  27. initial 64K
  28.  
  29. next 8K
  30.  
  31. minextents
  32.  
  33. maxextents unlimited
  34.  
  35. );
  36.  
  37. -- Add comments to the columns
  38.  
  39. comment on column DIMENSION_NAME.dimensionkey
  40.  
  41. is '维度表表id';
  42.  
  43. comment on column DIMENSION_NAME.dimensionen
  44.  
  45. is '维度表英文名';
  46.  
  47. comment on column DIMENSION_NAME.dimensionch
  48.  
  49. is '维度表中文名';

4.1.4.3数据展示

4.1.5:区域维度表

4.1.5.1表作用

这里只是拿出一个数据分析中的维表作为讲解使用,程序中使用到而已,具体的维表根据自己的分析需求而定,这里就拿区域维度表来给cube中的不同角色赋权,即那些角色可以访问哪些区域,当然这里可以换成任意一个三级以内的维度表.

4.1.5.2表结构

  1. -- Create table
  2.  
  3. create table PAREA
  4.  
  5. (
  6.  
  7. countrykey NUMBER,
  8.  
  9. country NVARCHAR2(),
  10.  
  11. provincekey NUMBER,
  12.  
  13. province NVARCHAR2(),
  14.  
  15. citykey NUMBER,
  16.  
  17. city NVARCHAR2()
  18.  
  19. )
  20.  
  21. tablespace TBS_COGNOS
  22.  
  23. pctfree
  24.  
  25. initrans
  26.  
  27. maxtrans
  28.  
  29. storage
  30.  
  31. (
  32.  
  33. initial 64K
  34.  
  35. next 8K
  36.  
  37. minextents
  38.  
  39. maxextents unlimited
  40.  
  41. );
  42.  
  43. -- Add comments to the columns
  44.  
  45. comment on column PAREA.countrykey
  46.  
  47. is '国家key';
  48.  
  49. comment on column PAREA.country
  50.  
  51. is '国家';
  52.  
  53. comment on column PAREA.provincekey
  54.  
  55. is '省份key';
  56.  
  57. comment on column PAREA.province
  58.  
  59. is '省份';
  60.  
  61. comment on column PAREA.citykey
  62.  
  63. is '城市key';
  64.  
  65. comment on column PAREA.city
  66.  
  67. is '城市';

4.1.5.3数据展示

4.2:关键java程序功能说明

4.2.1:根据access_table表找出每一个roleid的所有维度表的授权信息

参照demo项目中的GetAllAccessTable(String dimensionstr)方法就可以得到该model指定维度下面的所有角色的类似下面格式的授权信息信息

10001:parea:20000,10000

10002:parea:10001,1000301

10003:parea:1000302,20000

10004:parea:10003,20000,1000101

10005:parea:10000,20001

10006:parea:10003

10007:parea:1000302

4.2.2:根据roleid对应的每一个维度表的授权信息的到filter 字符串

紧接着4.2.1然后参照demo项目中的GetFilterStr(String tablename,String filterstr)方法就可以为每一个角色每一个表得到所有授权的信息

4.2.3:去除List中对象ID一样的对象或者合并对象ID一样的value值

4.2.3.1: 去除List中对象ID一样的对象

详情参照update_customview(int  modelid )中的双重for循环

4.2.3.2合并List中对象ID一样的value值

详情参照GetAllAccessTable (String dimensionstr)中的双重for循环

4.2.4:创建可执行文件之前清空之前的内容

详情参照clearfile(int modelid)方法

4.3:可执行文件格式说明

4.3.1:修改model权限的mdl文件格式说明

这里主要说一下update_customview的执行逻辑为什么要按照下面的顺序执行

打开模型文件1

删除所有以角色名称命名的视图2

增加管理员视图3

把管理员角色加入管理员视图4

SecurityObjectMake 'CAMID("Intrust:r:10000")' SecurityNamespace "Intrust"5

添加所有角色视图6

添加所有角色到对应的角色视图里面7

增加所有视图到cube中8

保存模型9

1-9我想说的就是2-4

2的代码如下面所示,作用是清空之前模型的所有权限设置,这样可以保证程序重新按照数据库最新的权限关系生产Custom view.

CustomViewDelete "管理员"

CustomViewDelete "中国大区总经理"

CustomViewDelete "信托一部经理"

CustomViewDelete "信托二部经理"

CustomViewDelete "信托三部经理"

CustomViewDelete "财务部经理"

CustomViewDelete "浙江大区经理"

CustomViewDelete "宁波分区经理"

3-4的代码如下面所示,作用是每次默认为管理员添加最高权限,这样就可以避免每次在access_table中添加管理员对应的多个维度表的值

SecurityNameSpaceMake "Intrust" SecurityNamespaceCAMID 'CAMID("Intrust")'

CustomViewMake "管理员"

SecurityObjectMake 'CAMID("Intrust:r:10000")' SecurityNamespace "Intrust"

SecurityObjectDisplayName "管理员" SecurityObjectType SecurityType_Role

CustomViewList "管理员" EndList

4.3.2:打开可执行文件的批处理文件格式说明

taskkill  /f  /im  BIBusTKServerMain.exe

D:

cd D:\Program Files (x86)\ibm\cognos\c10\bin

"cogtr.exe" -n2   "D:\Model\TR\Intrust_update.mdl"

首先要杀掉cube的访问进程,不然刷新不了cube提示被占用

其次转到服务器的cogtr.exe目录,只有转到此目录才可以执行model的相关操作

最后执行打开mdl模型刷新cube

4.4:action执行方法逻辑

int modelid=Integer.parseInt(request.getParameter("modelid"));

qu.update_customview(modelid);//创建可执行文件

qu.executecmd(modelid);//调用bat文件去打开可执行文件和刷新cube

String createresult="success";

out = response.getWriter();

out.print(createresult);//把执行完成的结果返回给Ajax

4.5:功能展示与效果查看

4.5.1:Java  project给出cube列表

4.5.2:点击更新权限,后台执行所有操作,同事提示更新成功

4.5.3:可执行文件被更新,模型文件也被更新,cube也被刷新

4.5.4:打开模型看执行的效果,赋权成功

Transform数据权限浅析2之利用Java完成权限设置的更多相关文章

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

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

  2. 利用JAVA API函数实现数据的压缩与解压缩

      综述 许多信息资料都或多或少的包含一些多余的数据.通常会导致在客户端与服务器之间,应用程序与计算机之间极大的数据传输量.最常见的解决数据存储和信息传送的方法是安装额外的存储设备和扩展现有的通讯能力 ...

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

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

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

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

  5. 在oracle中存入date类型数据遇到的问题及其解决方法(利用java.sql.date和Timestamp)

    转自:https://blog.csdn.net/ShadowerWArden/article/details/80652377 1. 使用JDBC操作Oracle数据库时,使用java.sql.Da ...

  6. 利用Java动态生成 PDF 文档

    利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那 ...

  7. Java访问权限控制

    访问权限控制           java提供了访问权限修饰词,以供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的.访问权限控制的等级,从最大权限到最小权限依次是:public.prote ...

  8. SpringAOP01 利用AOP实现权限验证、利用权限验证服务实现权限验证

    1 编程范式 1.1 面向过程 1.2 面向对象 1.3 面向切面编程 1.4 函数式编程 1.5 事件驱动编程 2 什么是面向切面编程 2.1 是一种编程范式,而不是一种编程语言 2.2 解决一些特 ...

  9. 利用java反射调用类的的私有方法--转

    原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...

随机推荐

  1. CF986B Petr and Permutations [逆序对]

    题目传送门 Petr and Permutations 格式难调,题面就不放了. 分析: 胡乱分析+猜测SP性质一波.然后被学长告知:“1~n的排列交换次数与逆序对的奇偶性相同.”然后就愉快地A了. ...

  2. scrapy实现多级页面的抓取时使用meta传递item数据的问题(转)

    name = 'doubanzufang'start_urls = ['https://www.douban.com/group/tianhezufang/discussion?start=50'] ...

  3. Mybatis源码分析之Mapper的创建和获取

    Mybatis我们一般都是和Spring一起使用的,它们是怎么融合到一起的,又各自发挥了什么作用? 就拿这个Mapper来说,我们定义了一个接口,声明了一个方法,然后对应的xml写了这个sql语句, ...

  4. vue页面开发遇到的坑,都是泪!src属性,freemarker取值

    总结下今天做的看图识别药材名的功能所遇到的问题以及解决措施. 效果图如下 对应的连接 http://www.xinghengedu.com/getTenActivityQuestions.jspx 可 ...

  5. php 5.6 安装openssl extension 出现编译错误

    废话不多说,直接上问题: PHP和openssl extension都是最新版本的,标准步骤安装时候出现如下问题: php:php-5.6.27 openssl:openssl-1.1.0e ==== ...

  6. django 编码错误

    估计这个问题是2.7的问题3.0好像就统一utf编码了 报错代码: python :ascii codec can't decode byte 0xe8 in posi 当django中报这个错误的时 ...

  7. codevs 1230【pb_ds】

    题目链接[http://codevs.cn/problem/1230/] 题意:给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过. 题解:很简单的一道题,可以选择用 ...

  8. 加密url

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 可以采用 https 证书 双向 加密验证. 加密到 JNI 里面,还是可以通过抓包工具 ...

  9. Map之类的东西

    http://www.cnblogs.com/anywei/archive/2011/10/27/2226830.html http://blog.csdn.net/aqzwss/article/de ...

  10. Python字典树实现

    class Trie: # word_end = -1 def __init__(self): """ Initialize your data structure he ...