基于java语言的给cube添加custom view来实现权限控制
今天是农历2014年的最后一个工作日了,在这里提前祝大家新年快乐、羊年大吉!当然本人今天也拿出来点儿真东西,做为献给大家的新年礼物,依次共勉.
下文主要讲述的是使用Java代码来完成对cube基于部门维度创建custom view,实现角色级别的权限控制
第一部分:通用数据库设计
1:事实表(订单分析)--存放departkey关联部门

2:维度表(部门)

3:赋权表

role_id以及对应的role_name,来源于cognos cjap认证中的角色表
depart_id以及对应的depart_name来源于上面的部门维度表
第二部分:Java project详细设计步骤
2.1:整体架构

2.2:类功能详细描述
AddViewToCube.java主要是测试入口
GetCon得到oracle数据库的链接
QueryUtil查询工具类
AccessTable和Department是两个实例Bean,提供数据库字段值和set以及get方法
2.3:查询工具类代码解析
| QueryUtil(类) | ||
| 方法列表 | 参数列表 | 实现功能 |
| public ArrayList<Department> GetDepartment() | 无参数 | 得到所有的部门,每一个部门对应一个custom view |
| public String GetFilterStr(int departid) | departid-部门id | 根据具体部门过滤掉其他部门的权限 |
| public ArrayList<AccessTable> GetAccessRole() | 无参数 | 得到所有在access_table中已经授权的角色 |
| public String GetDepartForRole(int roleid) | roleid-角色id | 根据具体角色得到该角色在access_table中所有的授权部门名称 |
| public void clearfile(String filename) | String filename生成mdl语句的文件路径 | 清空一个文件 |
| public void update_customview(String cubename,String targetmodel,String dimension,String filename,String namespacename,String namespaceid ) | cubename-mdl模型中生成cube的名称 | 执行add view的主函数,必须传入足够的参数 |
| targetmodel-需要增加权限的mdl文件路径 | ||
| dimension-cube模型中需要增加权限的维度名称 | ||
| filename-mdl语句的输出文件位置 | ||
| namespacename-Cognos认证的空间名称 | ||
| namespaceid-Cognos认证的空间ID | ||
2.4:主要代码实例
GetDepartForRole方法
public String GetDepartForRole(int roleid) throws ClassNotFoundException, SQLException
{
Connection con=new GetCon().getcon_king();
Statement stm=con.createStatement();
ResultSet rs=stm.executeQuery("select * from access_table where role_id="+roleid);
ArrayList<AccessTable> list=new ArrayList<AccessTable>();
while(rs.next())
{
AccessTable at=new AccessTable();
at.setRole_id(rs.getInt(1));
at.setDepart_id(rs.getInt(2));
at.setRole_name(rs.getString(3));
at.setDepart_name(rs.getString(4));
list.add(at);
}
System.out.println("lietsize:"+list.size());
if(list.size()>0)
{
for(int i=0;i<list.size();i++)
{
for(int j=0;j<list.size()-1;j++)
{
if(list.get(j).getRole_id()==list.get(j+1).getRole_id())
{
list.get(j).setDepart_name(list.get(j).getDepart_name()+'"'+" "+'"'+list.get(j+1).getDepart_name());
list.remove(j+1);
}
}
} } return list.get(0).getDepart_name();
}
update_customview方法
public void update_customview
(String cubename,String targetmodel,String dimension,String filename,String namespacename,String namespaceid ) throws IOException, ClassNotFoundException, SQLException
{ QueryUtil qu=new QueryUtil();//创建工具类
FileOutputStream fos=new FileOutputStream(filename,true);//定义一个字符输出流,True表示在文件尾部追加
qu.clearfile(filename);//先清空
String mdlpath="OpenMDL"+" "+'"'+targetmodel+'"'; //定义一个要修改custom view 的mdl文件的位置
String namespace="SecurityNameSpaceMake"+" "+'"'+namespacename+'"'+" "+"SecurityNamespaceCAMID"+" "+"'"+"CAMID"+"("+'"'+namespaceid+'"'+")"+"'";//指定第三方人中空间的名称和ID
fos.write(mdlpath.getBytes());//输出到filename中,下文不再多说
fos.write("\r\n".getBytes());//换行,下文不再多说
fos.write(namespace.getBytes());
fos.write("\r\n".getBytes());
ArrayList<Department> list=qu.GetDepartment(); //从数据库中读出所有Department
for(int i=0;i<list.size();i++)
{
Department d=new Department();
d=list.get(i);
//循环输出为每一个维度值创建custom view,同时采用Filter过滤掉其他维度值
String str3="ViewMake"+" "+'"'+d.getDepart_name()+'"'+" "+"Dimension"+" "+'"'+dimension+'"'+" "+"ViewSecurity"+" "+
'"'+d.getDepart_name()+'"'+" "+qu.GetFilterStr(d.getDepart_id());
String str4="CustomViewMake"+" "+'"'+d.getDepart_name()+'"'+" "+"DimensionView"+" "+'"'+dimension+'"'+" "+
'"'+d.getDepart_name()+'"';
//对应的view写入文件
fos.write(str3.getBytes());
fos.write("\r\n".getBytes());
fos.write(str4.getBytes());
fos.write("\r\n".getBytes());
}
ArrayList<AccessTable> list1=qu.GetAccessRole(); //从数据库中读出所有Department
for(int h=0;h<list1.size();h++)
{
AccessTable at=new AccessTable();
at=list1.get(h);
//循环把每一个角色添加到对应的custom view,一个角色可以对应多个custom view,建信需求是把部门作为角色来用
String str5="SecurityObjectMake"+" "+"'CAMID("+'"'+namespaceid+":r:"+""+at.getRole_id()+'"'+")"+"'"+" "+"SecurityNamespace"+" "+'"'+namespaceid+'"';
String str6="SecurityObjectDisplayName"+" "+'"'+at.getRole_name()+'"'+" "+"SecurityObjectType"+" "+"SecurityType_Role";
String str7="CustomViewList"+" "+'"'+qu.GetDepartForRole(at.getRole_id())+'"'+" "+"EndList";
fos.write(str5.getBytes());
fos.write("\r\n".getBytes());
fos.write(str6.getBytes());
fos.write("\r\n".getBytes());
fos.write(str7.getBytes());
fos.write("\r\n".getBytes());
} String str8="PowerCubeCustomViewListUpdate"+" "+"Cube"+" "+'"'+cubename+'"';
String str9="StartList";
String str10="";
String str11="ENDLIST"; //得到所有的viewname
for(int k=0;k<list.size();k++)
{
Department d=new Department();
d=list.get(k);
str10=str10+'"'+d.getDepart_name()+'"'+" ";
}
fos.write(str8.getBytes());
fos.write("\r\n".getBytes());
fos.write(str9.getBytes());
fos.write("\r\n".getBytes());
fos.write(str10.getBytes());
fos.write("\r\n".getBytes());
fos.write(str11.getBytes());
fos.write("\r\n".getBytes());
fos.close();//流要及时关闭
System.err.print("write is ok!");
}
2.5:方法入口
public static void main(String args[]) throws ClassNotFoundException, SQLException, IOException
{
QueryUtil qu=new QueryUtil();
String filename="C:\\Users\\king\\Documents\\Transformer\\Models\\订单数据分析_update.mdl";
String cubename="订单数据分析";
String updatemdl="C:\\Users\\king\\Documents\\Transformer\\Models\\订单数据分析.mdl";
String dimension="部门维度";
String namespacename="Intrust";
String namespaceid="Intrust";
qu.update_customview(cubename,updatemdl,dimension,filename,namespacename,namespaceid);
//System.out.print(qu.GetDepartForRole(1));
}
三:生产的mdl文件效果
OpenMDL "C:\Users\king\Documents\Transformer\Models\订单数据分析.mdl"
SecurityNameSpaceMake "Intrust" SecurityNamespaceCAMID 'CAMID("Intrust")'
ViewMake "信托一部" Dimension "部门维度" ViewSecurity "信托一部" Filter "" Filter ""
CustomViewMake "信托一部" DimensionView "部门维度" "信托一部"
ViewMake "信托二部" Dimension "部门维度" ViewSecurity "信托二部" Filter "" Filter ""
CustomViewMake "信托二部" DimensionView "部门维度" "信托二部"
ViewMake "信托三部" Dimension "部门维度" ViewSecurity "信托三部" Filter "" Filter ""
CustomViewMake "信托三部" DimensionView "部门维度" "信托三部"
SecurityObjectMake 'CAMID("Intrust:r:1")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "系统维护和管理人员" SecurityObjectType SecurityType_Role
CustomViewList "信托一部" "信托二部" "信托三部" EndList
SecurityObjectMake 'CAMID("Intrust:r:1")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "系统维护和管理人员" SecurityObjectType SecurityType_Role
CustomViewList "信托一部" "信托二部" "信托三部" EndList
SecurityObjectMake 'CAMID("Intrust:r:2")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "程序开发人员" SecurityObjectType SecurityType_Role
CustomViewList "信托一部" "信托二部" "信托三部" EndList
SecurityObjectMake 'CAMID("Intrust:r:2")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "程序开发人员" SecurityObjectType SecurityType_Role
CustomViewList "信托一部" "信托二部" "信托三部" EndList
SecurityObjectMake 'CAMID("Intrust:r:100")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "董事长" SecurityObjectType SecurityType_Role
CustomViewList "信托一部" "信托二部" "信托三部" EndList
SecurityObjectMake 'CAMID("Intrust:r:100")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "董事长" SecurityObjectType SecurityType_Role
CustomViewList "信托一部" "信托二部" "信托三部" EndList
SecurityObjectMake 'CAMID("Intrust:r:101")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "信托一部经理" SecurityObjectType SecurityType_Role
CustomViewList "信托一部" EndList
SecurityObjectMake 'CAMID("Intrust:r:102")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "信托二部经理" SecurityObjectType SecurityType_Role
CustomViewList "信托二部" EndList
SecurityObjectMake 'CAMID("Intrust:r:1")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "系统维护和管理人员" SecurityObjectType SecurityType_Role
CustomViewList "信托一部" "信托二部" "信托三部" EndList
SecurityObjectMake 'CAMID("Intrust:r:2")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "程序开发人员" SecurityObjectType SecurityType_Role
CustomViewList "信托一部" "信托二部" "信托三部" EndList
SecurityObjectMake 'CAMID("Intrust:r:100")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "董事长" SecurityObjectType SecurityType_Role
CustomViewList "信托一部" "信托二部" "信托三部" EndList
PowerCubeCustomViewListUpdate Cube "订单数据分析"
StartList
"信托一部" "信托二部" "信托三部"
ENDLIST
四:操作步骤
1:使用Transform打开已经生成mdl命令的文件C:\\Users\\king\\Documents\\Transformer\\Models\\订单数据分析_update.mdl
2:如果报错如下

那么查看是否维度层级还没生成,部门下面无内容

Generate categories

再次查看,维度层级已经生成

再次打开

可以看到已经OK了,效果如下图,cube下面有对应custom view ,cust view中有access_table中每一个部门对应的所有角色

五:查看展示效果
5.1:用管理员登陆可以查看所有部门数据

5.2:用张三登陆可以查看其对应的信托一部的数据

六:思路概述
1:利用程序读出数据库中部门数量 ,生成对应个数的custom view,每一个custom view只给对应的部门ID授权
ViewMake "信托一部" Dimension "部门维度" ViewSecurity "信托一部" Filter "2" Filter "3"
CustomViewMake "信托一部" DimensionView "部门维度" "信托一部"
2:根据每一个roleid的到所有授权的depart_name把所有已授权的depart都放到该角色的下面
SecurityObjectMake 'CAMID("Intrust:r:1")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "系统维护和管理人员" SecurityObjectType SecurityType_Role
CustomViewList "信托一部" "信托二部" "信托三部" EndList
3:把所有custom view加入到cube中
PowerCubeCustomViewListUpdate Cube "订单数据分析"
StartList
"信托一部" "信托二部" "信托三部"
ENDLIST
------------------------------------------------------------终,写于2015-2-13 17:20:59----------------------------------------------------------------------------------
基于java语言的给cube添加custom view来实现权限控制的更多相关文章
- JFinal -基于Java 语言的MVC极速 web 开发框架
JFinal概述 JFinal 是基于Java 语言的极速 web 开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java语言所有优势的同时再 ...
- 基于JAVA语言的多线程技术
1.简介 多线程技术属于操作系统范围内的知识: 进程与线程 可以这么理解,一个应用程序就是一个进程,在一个进程中包含至少一个线程:进程就是线程的容器,真正工作.处理任务的是线程. 进程是操作系统分配资 ...
- 基于Java语言开发jt808、jt809技术文章精华索引
很多技术开发人员喜欢追逐最新的技术,如Node.js, go等语言,这些语言只是解决了某一个方面,如只是擅长异步高并发等等,却在企业管理后台开发方面提供的支持非常不够,造成项目团队技术选项失败,开发后 ...
- 单循环链表(基于java语言)
public class CircleSinglyLinkList { private Node head; CircleSinglyLinkList(){ this.head = null; } C ...
- 【SpringSecurity系列1】基于SpringSecurity实现前后端分离无状态Rest API的权限控制
源码传送门: https://github.com/ningzuoxin/zxning-springsecurity-demos/tree/master/01-springsecurity-state ...
- 《神经网络算法与实现-基于Java语言》的读书笔记
文章提纲 全书总评 读书笔记 C1.初识神经网络 C2.神经网络是如何学习的 C3.有监督学习(运用感知机) C4.无监督学习(自组织映射) Rreferences(参考文献) 全书总评 书本印刷质量 ...
- Selenium(基于JAVA语言)-》在eclipse上运行web项目在Mac系统上启动时提示nodename nor servname provided解决办法
最近使用eclipse进行自动化测试时,遇到一种情况,无法调起浏览器,且有报错,如下: org.openqa.selenium.WebDriverException: failed to lookup ...
- 基于JAVA语言的selenium测试基础总结
目录一.基本语句1.循环控制(break,continue)3.字符的替换(replace,repalceFirst,replaceAll,regex)4.字符串的连接("+",a ...
- 基于JAVA语言的selenium总结
目录一.基本语句 1.循环控制(break,continue) 3.字符的替换(replace,repalceFirst,replaceAll,regex) 4.字符串的连接("+" ...
随机推荐
- 《Android虚拟机》----虚拟机概述
No1: 虚拟机是指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离的环境中的完整计算机系统. No2: Java虚拟机由如下五个部分组成:一组指令集.一组寄存器.一个栈.一个无用单元收集堆. ...
- 折半搜索【p4799】[CEOI2015 Day2]世界冰球锦标赛
Description 今年的世界冰球锦标赛在捷克举行.Bobek 已经抵达布拉格,他不是任何团队的粉丝,也没有时间观念.他只是单纯的想去看几场比赛.如果他有足够的钱,他会去看所有的比赛.不幸的是,他 ...
- python爬取人民币汇率中间价
python爬取人民币汇率中间价,从最权威的网站中国外汇交易中心. 首先找到相关网页,解析链接,这中间需要经验和耐心,在此不多说. 以人民币兑美元的汇率为例(CNY/USD),脚本详情如下: wind ...
- 2017/11/9 Leetcode 日记
2017/11/9 Leetcode 日记 566. Reshape the Matrix In MATLAB, there is a very useful function called 'res ...
- Python 正则表达式中级
首先是?: 在括号中用?:用在findall和split之中,去除括号优先级. 如果不用只输出括号内匹配的值 r 的作用是转义python里面换行符等,像是\n 不用加\来转义 1.子表达式 ...
- 破解NET的四大神器[转]
原本这篇文章可以更早一星期写出来与大家分享,由于某方面的原因耽搁到现在,心里竟有那么一点好像对不住大家的感觉.这当然与神器有关,因为我发现利用这四大神器我似乎觉得几乎所有的NET程序破解都不在话下了 ...
- Windows上安装Git替代cmd命令行程序
git是一个版本管理系统,利用好它,可以管理你项目文件,每个文件的更新删除修改,它都知道,还可以还原回历史的某个版本. msysgit是Windows版的Git. 1.下载地址:https://git ...
- Ruby:Sublime中开发Ruby需要注意的Encoding事项
背景 最近在用Sublime作为开发环境学习Ruby,本文就记录一下Ruby和Sublime在编码方面的问题. Sublime相关 默认的文件存储编码:UTF8 Sublime文件默认存储编码为UTF ...
- OAuth:第一天学习OAuth
收集的一些资料 http://baike.baidu.com/view/3948029.htm. http://oauth.net/. 使用百度的OAuth服务进行测试 代码下载:http://yun ...
- [翻译] PBJNetworkObserver 网络监控
PBJNetworkObserver 网络监控 https://github.com/piemonte/PBJNetworkObserver Introduction 'PBJNetworkObser ...