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,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
随机推荐
- EOJ 3260 袋鼠妈妈找孩子
暴力搜索. 主要目的就是找到任意一条路径,使得路径长度大于等于$k+1$,写个爆搜发现很快能出解.判断某点是否可走,需要看四周有没有已经走过的点的$dis$比这个点的$dis$小$2$或者$2$以上. ...
- 洛谷P1099 BZOJ1999 树网的核 [搜索,树的直径]
洛谷传送门,BZOJ传送门 树网的核 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V ...
- JavaScript的类型体系
一:总体的类型系 基本类型:数字类型(number),字符串类型(string),布尔类型(boolean); 复合类型:对象(对象,函数,数组等); 无类型:null(有定义),undefined( ...
- FutureTask简单实战
FutureTask是什么? 线程池的实现核心之一是FutureTask.在提交任务时,用户实现的Callable实例task会被包装为FutureTask实例ftask:提交后任务异步执行,无需用户 ...
- cf 633B A trivial problem
Mr. Santa asks all the great programmers of the world to solve a trivial problem. He gives them an i ...
- spring中使用@Value设置全局变量默认值
前几天在开发过程中遇到一个使用 spring 的 @Value 给类的全局变量设置默认值不成功的问题,最后通过查资料也是轻松解决,但是发现使用@Value也是有多种多样的方式,今天总算是将开发任务结束 ...
- CF400C/[思维题]
题目链接http://codeforces.com/problemset/problem/400/C 题意:给出一个(N,M)矩形和矩形里的p(p<=1e5)个点坐标,然后顺时针旋转x,镜面对称 ...
- ddms 安卓录制
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 屏幕录制, 视频录制 保存为 . 打开 .显示在浏览器里. 设备屏幕捕捉 刷 ...
- BZOJ 1030 [JSOI2007]文本生成器(AC自动机)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题目大意] 求出包含任意一个给定串的串数量 [题解] 我们求出不包含任意一个给 ...
- Centos7 下mysql大小写敏感问题
在Centos7 下mysql大小写敏感问题,会导致程序运行时找不到对应的表. 解决办法: 第一步:编辑/etc/my.cnf文件,在[mysqld]节下 添加 lower_case_table_na ...