SSAS中CUBE行权限数据级权限控制

原文:SSAS中CUBE行权限数据级权限控制

去年做了一个数据仓库的项目,其中涉及到了CUBE数据级权限的控制。在网上找这方面的资料,找到一个[BI] 通用数据级权限控制解决方案的实现(二):Cube中的角色设置与数据级权限控制。根据这个大牛的思路,做完之后发现有几个问题:

1. 传递给CUBE的用户必须是域用户或者数据库服务器WINDOWS用户。如果BI系统不是用的AD域认证而是传统的FORM认证,那么,BI里的用户需要对应一个WINDOWS用户。

2. 另外的WEB程序里保存对cube的角色权限之后,用户访问cube数据的权限控制并不能即时刷新,需要到SSAS数据库里手动保存一下角色,权限配置才能够生效。

首先添加一个SSAS的角色Role,注意角色的数据库权限设置不能勾选完全控制,不然后面我们配置的权限就没有任何意义。在成员身份为角色添加用户和组,按前面帖子里说的添加everyone,其实后面按照我的方法,这里不需要添加everyone,只需要添加一个最大权限的用户即可。如图一(还是添加的everyone)

                  图一

在左侧数据源及多维数据集的选项中需要给数据源及多维数据集读的权限。

在维度数据里选择需要设置权限的维度及维度属性,我这里的是一个父子级的维度,成本中心,选择成本中心层次结构。如图二,

                  图二

在允许的成员集里,我写的字符串如下

StrToSet(BII.GetCubeDimPerMems(CustomData(),"WEGODW","成本中心"))

其中,还是使用MDX的函数StrToSet来将我们自己写的DLL查询出的维度成员列表转换成MDX能够识别的Member Set。

GetCubeDimPerMems函数是我自己写的一个查询某个用户在数据库中保存的能够访问的某个维度的成员列表的字符串。第一个参数也是这个方法的核心,需要用到MDX的一个函数CustomData()。

CustomData(MDX)

如果已定义,则返回 CustomData 连接字符串属性的值;否则,返回 null。

返回值:CustomData 函数可以检索 CustomData 连接字符串属性并传递多维表达式 (MDX) 函数和语句将要使用的配置设置,例如,UserName (MDX) 和 CALL 语句 (MDX)。 例如,该函数可以用在动态安全表达式中,用于在 CustomData 连接字符串属性中选择允许的集成员或拒绝的集成员。

这里第二个和第三个参数没啥意义,我这里表示是我CUBENAME以及DIMNAME,大家可以自己随意发挥。

查询结果大致格式如下:

"[成本中心].[成本中心层次].&[1],[成本中心].[成本中心层次].&[2],[成本中心].[成本中心层次].&[3],[成本中心].[成本中心层次].&[4]"

那我们如何将我们WEB程序里的程序传递给SSAS呢?我这边使用了WEB.CONFIG里的connectingstring的方式,用连接字符串的方式将用户传递给SSAS,使之能够知道是哪个用户连接并打开了数据库。连接字符串如下:

string connectionString = "Provider=MSOLAP.5;Data Source=http://172.0.0.1:8088/OLAP/msmdpump.dll; Persist Security Info=true;Password=xxxxx;User ID=administrator;CustomData=UserName;initial catalog=DBName;Cube Name=CubeName;"

其中,User ID是我们需要连接SSAS库的最大权限的用户(管理员账户),相当于SQL SERVER里的SA账户。

重点就是CustomData属性,将我们WEB程序里的用户名,通过CustomData传递给SSAS,在SSAS里用MDX函数CustomData()来接收。比如我在connectionString里定义CustomData=zhangsan,在SSAS里通过CustomData()就能够得到”zhangsan“这个用户。

这里还有一点需要注意,SSAS数据库必须以HTTP的方式发布到IIS,这样才能够远程访问。

混了这么久园子,第一次写东西,算是对自己做过东西的一点总结,班门弄斧,还望各位前辈多多指教。

时间: 2024-08-13 15:32:34

SSAS中CUBE行权限数据级权限控制的相关文章

python之从文件中按行读取数据

#!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = 'jiangwenwen' # 从文件中按行读取数据 file = open("D:\坚果云\我的坚果云\\2019年计划.txt") while 1: lines = file.readlines(100000) if not lines: break for line in lines: print(line) 原文地址:https://www.cnblogs.c

关于Ext中多行删除数据的问题

删除多行数据,只要在代码中加上 selModel:Ext.create('Ext.selection.CheckboxModel',{mode:"SIMPLE"}), 1 Ext.apply(this, { 2 title: '商品单位', 3 id:'tMeUnitInfoid', 4 store: mystore, 5 selModel:Ext.create('Ext.selection.CheckboxModel',{mode:"SIMPLE"}), //多选

【Simple Java】往文件中按行写入数据

如下代码是一个Java小程序,用于往文件写入数据.每次运行该程序,一个新的文件被创建,之前旧的文件被删除:这与往文件追加内容是有区别的. public static void writeFile1() throws IOException { File fout = new File("out.txt"); FileOutputStream fos = new FileOutputStream(fout); BufferedWriter bw = new BufferedWriter(

循环读取文本中每行的数据

java代码: package com.zltest.bd; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; public class FileRead { public static void main(String[] args) throws Exception { File file = new Fil

菜单权限,按钮权限的设计及实现

最近,公司老大给了这个任务,功能差不多完成了,现将一些经过分享给大家! ------------------开始设计时----------------- 菜单权限的设计 思路: 5个表的建立:用户表.角色表.菜单表.用户角色表.角色菜单表 后台动态加载json数据给前台.   这里的json数据,就是菜单栏的数据(就是通过后台数据查询找出当前用户拥有哪些菜单) 用户(操作员.管理员.超级管理员)只能看到自己对应的菜单数据 思路:sql语句加上对应的where条件 ,来对查询到的所有数据做进一步的

杂项-权限管理:权限管理

ylbtech-杂项-权限管理:权限管理 权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少.权限管理几乎出现在任何系统里面,只要有用户和密码的系统. 很多人常将"用户身份认证"."密码加密"."系统管理"等概念与权限管理概念混淆. 1.返回顶部 1. 场景举例 企业IT管理员一般都能为系统定义角色,给用户分配角色.这就是最常见的基于角色访问控制.场景举例: 1,给张三赋予"人力资源经

MySQL列权限和程序权限管理

列权限管理 MySQL是由列级别权限存在的.这也体现了MySQL高级特性.实现了限制用户对表上特定列的访问权限. 一般都是实现对表级别不具备访问权限,但是对某些列有访问权限.当然也存在其他情形. 1# 列权限相关的字典表: ([email protected])[mysql]> desc columns_priv; +-------------+----------------------------------------------+------+-----+----------------

QuickBI助你成为分析师-保证数据安全:行级权限

摘要: 行级权限功能既可以提高工作效率,又可以避免泄露敏感的商业数据,实现了相同报表,不同用户组/用户查看不同数据的效果. Quick BI 的行级权限就可以实现在一份报表中,不同的人/用户组看不同的数据.目前只有高级版.专业版有行级权限的功能. 以一个销售团队为例,如果该销售团队的业务范围是全国,那么意味着他们需要随时掌握30多个省的销售情况,而且每一个省还有若干个城市,每一个城市还有若干个县:随着业务量的不断增大和扩容,他们所要查阅的销售数据也会日益增加. 在如此庞大且复杂的数据中,如果能够

java中内部类的创建四种情况,三种方式,及内部数据访问权限

内部类和外部类的关系,及内部静态类的数据访问权限,声明方式. 第一种,在外部类内部声明使用内部类,内部类的类型为static和非 static类型,内部类数据类型为private,protected,public 类型的访问权限.外部类为非静态声明和权限如下: package com; public class Test1 { //@author 张春蕾 private class Name{ private int i =1; public int s = 2; protected int m