一:项目背景

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表结构

-- Create table

create table TRANSFORMMODEL

(

  modelid         NUMBER,

  modelname       NVARCHAR2(),

  modelpath       NVARCHAR2(),

  modeldimension  NVARCHAR2(),

  modelupdatefile NVARCHAR2(),

  namespaceid     NVARCHAR2(),

  namespacename   NVARCHAR2(),

  batpath         NVARCHAR2()

)

tablespace TBS_COGNOS

  pctfree 

  initrans 

  maxtrans 

  storage

  (

    initial 64K

    next 8K

    minextents 

    maxextents unlimited

  );

-- Add comments to the columns

comment on column TRANSFORMMODEL.modelid

  is '模型id,主键';

comment on column TRANSFORMMODEL.modelname

  is '模型名称,和模型中cube名称保持一致';

comment on column TRANSFORMMODEL.modelpath

  is '模型在服务器上的绝对路径';

comment on column TRANSFORMMODEL.modeldimension

  is '模型权限相关的维度表名称,可以是一个表,也可以是多个表,

多个表之间用逗号隔开如(pdept,ptype),如果为空表示cube不设置

相关数据权限,如果有维度表,则表示此cube在此维度上面做了权限控制.';

comment on column TRANSFORMMODEL.modelupdatefile

  is '模型对应的可执行文件,执行打开此文件的操作去修改模型文件的相关权限';

comment on column TRANSFORMMODEL.namespaceid

  is '模型所引用的用户空间id(Cognos第三方名称空间id)';

comment on column TRANSFORMMODEL.namespacename

  is '模型所引用的用户空间名称(Cognos第三方名称空间名称)';

comment on column TRANSFORMMODEL.batpath

  is '执行打开可执行文件并且生成cube的bat批处理文件的所在路径';

4.1.1.3数据展示

4.1.2:cognos认证角色表

4.1.2.1表作用

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

4.1.2.2表结构

-- Create table

create table ORG_ROLE

(

  role_id   VARCHAR2(),

  role_code VARCHAR2(),

  role_name VARCHAR2()

)

tablespace TBS_COGNOS

  pctfree 

  initrans 

  maxtrans 

  storage

  (

    initial 64K

    next 8K

    minextents 

    maxextents unlimited

  );

-- Add comments to the columns

comment on column ORG_ROLE.role_id

  is '角色id';

comment on column ORG_ROLE.role_code

  is '角色英文代码';

comment on column ORG_ROLE.role_name

  is '角色中文名称';

4.1.2.3数据展示

4.1.3:数据安全授权表

4.1.3.1表作用

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

4.1.3.2表结构

-- Create table

create table ACCESS_TABLE

(

  roleid     NUMBER,

  accesstype NVARCHAR2(),

  accessid_1 NUMBER,

  accessid_2 NUMBER,

  accessid_3 NUMBER

)

tablespace TBS_COGNOS

  pctfree 

  initrans 

  maxtrans 

  storage

  (

    initial 64K

    next 8K

    minextents 

    maxextents unlimited

  );

-- Add comments to the columns

comment on column ACCESS_TABLE.roleid

  is '角色id';

comment on column ACCESS_TABLE.accesstype

  is '授权维度表的中文名称,相对的表名称可以在DIMENSION_NAME中找到';

comment on column ACCESS_TABLE.accessid_1

  is '一、二、三级维表的第一级';

comment on column ACCESS_TABLE.accessid_2

  is '一、二、三级维表的第二级';

comment on column ACCESS_TABLE.accessid_3

  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表结构

-- Create table

create table DIMENSION_NAME

(

  dimensionkey NUMBER,

  dimensionen  NVARCHAR2(),

  dimensionch  NVARCHAR2()

)

tablespace TBS_COGNOS

  pctfree 

  initrans 

  maxtrans 

  storage

  (

    initial 64K

    next 8K

    minextents 

    maxextents unlimited

  );

-- Add comments to the columns

comment on column DIMENSION_NAME.dimensionkey

  is '维度表表id';

comment on column DIMENSION_NAME.dimensionen

  is '维度表英文名';

comment on column DIMENSION_NAME.dimensionch

  is '维度表中文名';

4.1.4.3数据展示

4.1.5:区域维度表

4.1.5.1表作用

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

4.1.5.2表结构

-- Create table

create table PAREA

(

  countrykey  NUMBER,

  country     NVARCHAR2(),

  provincekey NUMBER,

  province    NVARCHAR2(),

  citykey     NUMBER,

  city        NVARCHAR2()

)

tablespace TBS_COGNOS

  pctfree 

  initrans 

  maxtrans 

  storage

  (

    initial 64K

    next 8K

    minextents 

    maxextents unlimited

  );

-- Add comments to the columns

comment on column PAREA.countrykey

  is '国家key';

comment on column PAREA.country

  is '国家';

comment on column PAREA.provincekey

  is '省份key';

comment on column PAREA.province

  is '省份';

comment on column PAREA.citykey

  is '城市key';

comment on column PAREA.city

  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. EOJ 3262 黑心啤酒厂

    最大公约数. 计算$x$与$i$的最小公倍数,就是这些人至少需要喝几杯,最小公倍数除以$x$就是要买几瓶. #include <cstdio> #include <cmath> ...

  2. Python内置函数__slots__

    ''' 1.__slots__是什么:是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性) 2.引子:使用点来访问属性本质就是在访问类或者对象的_ ...

  3. Tomcat+Apache集群方案

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha # environment slash for Windows(反斜杠代表Windows ...

  4. [BZOJ4338][BJOI2015]糖果(扩展Lucas)

    先求出式子$P_{C_{K+m-1}^{m}}^{n}$,然后对于排列直接$O(n)$求解,对于组合用扩展Lucas求解. 但这题数据并没有保证任何一个模数的质因子的$p^k$在可线性处理的范围内,于 ...

  5. Luogu P3962 [TJOI2013]数字根 st

    题面 我先对数字根打了个表,然后得到了一个结论:\(a\)的数字根=\((a-1)mod 9+1\) 我在询问大佬后,大佬给出了一个简单的证明: \(\because 10^n\equiv 1(mod ...

  6. 【并查集】【枚举倍数】UVALive - 7638 - Number of Connected Components

    题意:n个点,每个点有一个点权.两个点之间有边相连的充要条件是它们的点权不互素,问你这张图的连通块数. 从小到大枚举每个素数,然后枚举每个素数的倍数,只要这个素数的某个倍数存在,就用并查集在这些倍数之 ...

  7. bzoj 1264: [AHOI2006]基因匹配Match

    1264: [AHOI2006]基因匹配Match Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球 ...

  8. Struts+Hibernate+Spring常见问题

    http://wanglihu.iteye.com/blog/1897718 1.java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisi ...

  9. 升压转换器 (Boost)

    升压转换器 (Boost) 需要将输入电压转换为较高的输出电压时,升压转换器 (Boost)是唯一的选择. 升压转换器透过内部 MOSFET 对电压充电来达成升压输出的目的,而当 MOSFET 关闭时 ...

  10. 创建Windows窗体 : WinMain() 与 WndProc()

    #include <windows.h> #include <mmsystem.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, ...