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 tablecreate table TRANSFORMMODEL(modelid NUMBER,modelname NVARCHAR2(20),modelpath NVARCHAR2(100),modeldimension NVARCHAR2(100),modelupdatefile NVARCHAR2(100),namespaceid NVARCHAR2(20),namespacename NVARCHAR2(20),batpath NVARCHAR2(50))tablespace TBS_COGNOSpctfree 10initrans 1maxtrans 255storage(initial 64Knext 8Kminextents 1maxextents unlimited);-- Add comments to the columnscomment on column TRANSFORMMODEL.modelidis '模型id,主键';comment on column TRANSFORMMODEL.modelnameis '模型名称,和模型中cube名称保持一致';comment on column TRANSFORMMODEL.modelpathis '模型在服务器上的绝对路径';comment on column TRANSFORMMODEL.modeldimensionis '模型权限相关的维度表名称,可以是一个表,也可以是多个表, 多个表之间用逗号隔开如(pdept,ptype),如果为空表示cube不设置相关数据权限,如果有维度表,则表示此cube在此维度上面做了权限控制.'; comment on column TRANSFORMMODEL.modelupdatefileis '模型对应的可执行文件,执行打开此文件的操作去修改模型文件的相关权限';comment on column TRANSFORMMODEL.namespaceidis '模型所引用的用户空间id(Cognos第三方名称空间id)';comment on column TRANSFORMMODEL.namespacenameis '模型所引用的用户空间名称(Cognos第三方名称空间名称)';comment on column TRANSFORMMODEL.batpathis '执行打开可执行文件并且生成cube的bat批处理文件的所在路径';
4.1.1.3数据展示
4.1.2:cognos认证角色表
4.1.2.1表作用
保存Cognos第三方认证时候的角色信息,BI项目采用的是CJAP认证方式
4.1.2.2表结构
-- Create tablecreate table ORG_ROLE(role_id VARCHAR2(60),role_code VARCHAR2(60),role_name VARCHAR2(60))tablespace TBS_COGNOSpctfree 10initrans 1maxtrans 255storage(initial 64Knext 8Kminextents 1maxextents unlimited);-- Add comments to the columnscomment on column ORG_ROLE.role_idis '角色id';comment on column ORG_ROLE.role_codeis '角色英文代码';comment on column ORG_ROLE.role_nameis '角色中文名称';
4.1.2.3数据展示
4.1.3:数据安全授权表
4.1.3.1表作用
存储角色和数据仓库中维度表之间的授权关系,该表中配置的维度表个数和模型信息表中modeldimension 字段包含的维度表个数保持一致,cube开发过程中就应该在该表中设计角色和维度直接的授权关系,即什么角色可以访问什么维度值.
4.1.3.2表结构
-- Create tablecreate table ACCESS_TABLE(roleid NUMBER,accesstype NVARCHAR2(30),accessid_1 NUMBER,accessid_2 NUMBER,accessid_3 NUMBER)tablespace TBS_COGNOSpctfree 10initrans 1maxtrans 255storage(initial 64Knext 8Kminextents 1maxextents unlimited);-- Add comments to the columnscomment on column ACCESS_TABLE.roleidis '角色id';comment on column ACCESS_TABLE.accesstypeis '授权维度表的中文名称,相对的表名称可以在DIMENSION_NAME中找到';comment on column ACCESS_TABLE.accessid_1is '一、二、三级维表的第一级';comment on column ACCESS_TABLE.accessid_2is '一、二、三级维表的第二级';comment on column ACCESS_TABLE.accessid_3is '一、二、三级维表的第三级';
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 tablecreate table DIMENSION_NAME(dimensionkey NUMBER,dimensionen NVARCHAR2(20),dimensionch NVARCHAR2(20))tablespace TBS_COGNOSpctfree 10initrans 1maxtrans 255storage(initial 64Knext 8Kminextents 1maxextents unlimited);-- Add comments to the columnscomment on column DIMENSION_NAME.dimensionkeyis '维度表表id';comment on column DIMENSION_NAME.dimensionenis '维度表英文名';comment on column DIMENSION_NAME.dimensionchis '维度表中文名';
4.1.4.3数据展示
4.1.5:区域维度表
4.1.5.1表作用
这里只是拿出一个数据分析中的维表作为讲解使用,程序中使用到而已,具体的维表根据自己的分析需求而定,这里就拿区域维度表来给cube中的不同角色赋权,即那些角色可以访问哪些区域,当然这里可以换成任意一个三级以内的维度表.
4.1.5.2表结构
-- Create tablecreate table PAREA(countrykey NUMBER,country NVARCHAR2(10),provincekey NUMBER,province NVARCHAR2(10),citykey NUMBER,city NVARCHAR2(10))tablespace TBS_COGNOSpctfree 10initrans 1maxtrans 255storage(initial 64Knext 8Kminextents 1maxextents unlimited);-- Add comments to the columnscomment on column PAREA.countrykeyis '国家key';comment on column PAREA.countryis '国家';comment on column PAREA.provincekeyis '省份key';comment on column PAREA.provinceis '省份';comment on column PAREA.citykeyis '城市key';comment on column PAREA.cityis '城市';
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:打开模型看执行的效果,赋权成功
转载于:https://www.cnblogs.com/wxjnew/p/4110651.html
Transform数据权限浅析2之利用Java完成权限设置相关推荐
- 怎么利用NTFS文件权限打造安全u盘
怎么利用NTFS文件权限打造安全u盘 发表时间:2013-08-24 00:31 来源:网友热荐 浏览:12540次 U盘使用越来越广泛,神州u盘启动官网今天教大家利用NTFS文件权限打造安全u盘.利 ...
- FrameWork数据权限浅析4之基于多维度配置表实现行级数据安全
FrameWork数据权限浅析4之基于多维度配置表实现行级数据安全 日子过得好苦逼,我过的很好,只是缺少¥.时间在变,而问题始终未变,你解不解决它都在那里一动不动.不知不觉已经发现手机的中央,电脑的右 ...
- 大数据学习笔记:利用JAVA项目操作HBase
文章目录 一.Java类与HBase数据模型之间的对应关系 二.利用JAVA项目操作HBase (一)HBase表基本操作 1.创建Java项目HBaseDemo 2.在pom.xml添加对hadoo ...
- java横向导出excel_利用Java进行Excel的数据导入导出
1. 引言 MS 的电子表格(Excel)是Office 的重要成员,是保存统计数据的一种常用格式.在一 个Java 应用中,将一部分数据生成Excel 格式,是与其他系统无缝连接的重要手段.在远程 ...
- 数据模拟:利用Java模拟数据(姓名,邮箱,地址,电话等信息,时间,工资,1-10随机数)并存入mysql
学大数据分析的同学们在做数据分析时一般很难找到适合数据集,本文就来分享一下如何利用Java模拟数据,并将产生数据保存至mysql数据库中. 主要技术就是Java产生数据,利用mybatis存入mysq ...
- 利用Java爬取基金网站的基金数据,快速筛选优质热门基金
爬取数据源为天天基金网的页面基金数据 利用java爬取基金数据并简单筛选后的效果图 创建java maven项目,推荐用spring boot maven需要引入的jar包依赖 <!--lomb ...
- 利用JAVA向Mysql插入一亿数量级数据—效率测评
利用JAVA向Mysql插入一亿数量级数据-效率测评 这几天研究mysql优化中查询效率时,发现测试的数据太少(10万级别),利用 EXPLAIN 比较不同的 SQL 语句,不能够得到比较有效的测评数 ...
- java读取网络图片数据_如何利用java读取网络照片
如何利用java读取网络照片 Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的`编程.以下是小编为大家搜索整理的如何利用java读取网络照片, ...
- 利用Java存储过程简化数据库操作
利用Java存储过程沟通SQL.XML.Java.J2EE和Web服务. 存储过程(stored procedure)允许将运行于数据库层中的持久性逻辑与运行于中间层中的商务逻辑有效地分离开来. ...
最新文章
- 过程即奖励(The Journey is the Reward)
- python界面颜色怎么改变_pycharm 界面风格修改
- dart系列之:安全看我,dart中的安全特性null safety
- tf.train.get_checkpoint_state
- linux setsockopt函数
- Python机器学习:逻辑回归005决策边界
- 记者“卧底”程序猿的故事
- App Store最新审核指南(2015年3月更新版)
- python自学-新手如何自学python课程?
- python元组排序_python元组怎么排序
- hadoop put命令的格式_Hadoop Shell命令(基于linux操作系统上传下载文件到hdfs文件系统基本命令学习)...
- English语法_分词用法-作名词
- 中继器的使用方法(终)
- IE浏览器被2345网址导航劫持
- javascript学习网站
- layui之图片上传
- 【统计学】从样本到总体
- java的nullpoint_Java中避免NullPointerException的方法总结
- C语言倒序输出/C语言倒置输出
- 可自建中继服务器的远程桌面软件: RustDesk