Transform数据权限浅析2之利用Java完成权限设置
一:项目背景
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完成权限设置的更多相关文章
- Transform数据权限浅析1之mdl语句批量加载权限
Cognos建模工具除了Framework之外,还有一个Transform,两者的最大区别就是在于Framework是通过结构直连关系数据库的,数据根据数据仓库的变化而变化,而Transform是生产 ...
- 利用JAVA API函数实现数据的压缩与解压缩
综述 许多信息资料都或多或少的包含一些多余的数据.通常会导致在客户端与服务器之间,应用程序与计算机之间极大的数据传输量.最常见的解决数据存储和信息传送的方法是安装额外的存储设备和扩展现有的通讯能力 ...
- FrameWork数据权限浅析4之基于多维度配置表实现行级数据安全
日子过得好苦逼,我过的很好,只是缺少¥.时间在变,而问题始终未变,你解不解决它都在那里一动不动.不知不觉已经发现手机的中央,电脑的右下角已经出现了201411的字样,突然从桌子上爬起来,差点忘记了自己 ...
- FrameWork数据权限浅析2之基于用户的配置表实现行级数据安全
在上一篇笔记中我已经说了如何利用FM自带的机制配合我们已经通过验证的用户空间的组来实现行级数据安全的控制,但是由于上一个方法存在的缺点是以后如果对该对象增加基于用户或者角色的访问权限就需要开发人员去F ...
- 在oracle中存入date类型数据遇到的问题及其解决方法(利用java.sql.date和Timestamp)
转自:https://blog.csdn.net/ShadowerWArden/article/details/80652377 1. 使用JDBC操作Oracle数据库时,使用java.sql.Da ...
- 利用Java动态生成 PDF 文档
利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那 ...
- Java访问权限控制
访问权限控制 java提供了访问权限修饰词,以供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的.访问权限控制的等级,从最大权限到最小权限依次是:public.prote ...
- SpringAOP01 利用AOP实现权限验证、利用权限验证服务实现权限验证
1 编程范式 1.1 面向过程 1.2 面向对象 1.3 面向切面编程 1.4 函数式编程 1.5 事件驱动编程 2 什么是面向切面编程 2.1 是一种编程范式,而不是一种编程语言 2.2 解决一些特 ...
- 利用java反射调用类的的私有方法--转
原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
随机推荐
- 2017 计蒜之道 初赛 第五场 D. UCloud 的安全秘钥(困难)
小数据打表,大数据暴力. 导致超时的主要原因是$m$小的询问次数太多,可以把$m≤10$的答案直接暴力打表存起来,$m>10$的用$C$题的方法即可. #include <iostream ...
- CTF西湖论剑
一,西湖论剑 itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是要写入转换结果的目标字符串,第三个参数是转移数字时所用 的基数.在上例中,转换基数为10.10:十进制:2:二进制... ...
- nyoj 18 The Triangle
The Triangle 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure ...
- I/O 多路复用之select、poll、epoll详解
select,poll,epoll都是IO多路复用的机制.I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但s ...
- JAVA中关于大数问题
这里只是java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目. 一.样例:java中的输出a+b import java.io ...
- BZOJ2938 POI2000病毒
我们不能让重复过的字串出现在无限串上(就叫这个了...) 也就是要自动机一直能匹配但就是匹配不到,那么就是在自动机上找一个环. dfs判环即可.注意是个有向图. #include<bits/st ...
- 【tarjan+拓扑】BZOJ3887-[Usaco2015 Jan]Grass Cownoisseur
[题目大意] 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为1) [思路] 首先 ...
- python开发_difflib字符串比较
在python的difflib中 HtmlDiff:比较后以html方法展示 我们比较的是字符串: 'hello world!' 和 'hElLO Wor2d!' 具体代码: from difflib ...
- UESTC 2015dp专题 F 邱老师看电影 概率dp
邱老师看电影 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/65 Descr ...
- 实战-130W表增加字段耗时
工作需要对130W的表增加字段,因为是操作线上数据库,所以提前在本地调查下耗时. 首先建表: CREATE TABLE `alter_cloumn_test` ( `id` int(11) unsig ...