kingwang
作者kingwang·2015-11-06 11:46
商业智能工程师·前景科技有限公司

基于java语言的给cube添加custom view来实现权限控制

字数 17811阅读 2477评论 4赞 5

下文主要讲述的是使用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方法

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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方法

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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("rn".getBytes());//换行,下文不再多说
            fos.write(namespace.getBytes());
            fos.write("rn".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("rn".getBytes());
                fos.write(str4.getBytes());
                fos.write("rn".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("rn".getBytes());
                fos.write(str6.getBytes());
                fos.write("rn".getBytes());
                fos.write(str7.getBytes());
                fos.write("rn".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("rn".getBytes());
            fos.write(str9.getBytes());
            fos.write("rn".getBytes());
            fos.write(str10.getBytes());
            fos.write("rn".getBytes());
            fos.write(str11.getBytes());
            fos.write("rn".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:UserskingDocumentsTransformerModels订单数据分析.mdl" SecurityNameSpaceMake "Intrust" SecurityNamespaceCAMID 'CAMID("Intrust")' ViewMake "信托一部" Dimension "部门维度" ViewSecurity "信托一部" Filter "2" Filter "3" CustomViewMake "信托一部" DimensionView "部门维度" "信托一部" ViewMake "信托二部" Dimension "部门维度" ViewSecurity "信托二部" Filter "1" Filter "3" CustomViewMake "信托二部" DimensionView "部门维度" "信托二部" ViewMake "信托三部" Dimension "部门维度" ViewSecurity "信托三部" Filter "1" Filter "2" 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----------------------------------------------------------------------------------

英文名:kingwang MSN : nidelanjiekou@hotmail.com 

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

5

添加新评论4 条评论

amu0722amu0722CEO打毛党
2016-01-15 14:27
mark下 刚看到
海鲜海鲜研发工程师上海某公司
2015-11-19 17:06
赞,赞,赞!
yuzsrzyuzsrz系统工程师Babal
2015-11-19 11:06
太棒了,正在研究这个。

顺便问一句,对机构用户多的时候 比如,好几千个用户,不能一个一个用户往 view里面拖吧。 是不是最好的办法就是,通过java代码方式批量执行?
白帝舞剑行白帝舞剑行IT顾问IBM
2015-11-10 14:07
非常好,很有价值
Ctrl+Enter 发表

作者其他文章

相关问题

相关资料

X社区推广