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:打開模型看執行的效果,賦權成功
?
posted on 2014-11-20 15:04 kingstudy 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/wxjnew/p/4110651.html
總結
以上是生活随笔為你收集整理的Transform数据权限浅析2之利用Java完成权限设置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: seo是网站优化的核心技术
- 下一篇: Java-马士兵设计模式学习笔记-观察者