去年做了一个数据仓库的项目,其中涉及到了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;Roles=Role;"

其中,User ID是我们需要连接SSAS库的最大权限的用户(管理员账户),相当于SQL SERVER里的SA账户。Roles=role必须强制进行角色认证,不然当以administrator用户连接SSAS时,会取得完全控制权限。

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

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

补充一点,关于将用户权限设置更新之后,CUBE权限不能及时刷新的问题,这个其实是SQL SERVSER的一个BUG,貌似到2014版本还未得到解决。解决方法为更新下CUBE的ROLE。代码如下

Server ser = new Server();
ser.Connect(connectString_cube);
Database db = ser.Databases.FindByName(DbName);
Role _role = db.Roles[0];
_role.Update();

在设置用户维度数据访问权限之后,更新ROLE即可。 

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

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

  1. SSAS中CUBE的多对多关系既可以出现在中间事实表上也可以出现在中间维度表上

    开发过SSAS中CUBE的朋友,肯定都知道维度用法中的多对多关系, 这篇文章不想详细阐述多对多关系在CUBE中的结构,详情请在网上寻找CUBE多对多关系的介绍资料. 下面是是一个典型的CUBE中多对多 ...

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

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = 'jiangwenwen' # 从文件中按行读取数据 file = open(& ...

  3. SSAS中Cube的结构

    在SSAS(SQL Server Analysis Services)中构建Cube和编写MDX的时候,我们很容易被一些名词弄糊涂,比如:Dimension(维度),Measures Dimensio ...

  4. SNF快速开发平台2019-权限管理模型-记录级-字段级权限实践

    1.1.1  字段级权限 字段级权限适用于对不同人的能否查看或录入不同表不同字段的权限控制. 是否启用字段级权限配置 不启用字段级权限后,[用户权限管理]程序[字段级权限]按钮会隐藏,导致无法给管理其 ...

  5. 权限系统设计(0):权限系统设计基本概念改需-MAC/RBAC引子

    此篇主要对权限系统设计所涉的一些专业术语重点梳理.从我们windows的文件系统 自主访问控制 到基于角色访问控制. 权限设计基本术语 对后面会用到的词汇做一个简要说明 什么是权限(许可) 权限(Pr ...

  6. Quick BI独创千人千面的行级权限管控机制

    摘要 就数据访问权限而言,阿里巴巴以“被动式授权”为主,你需要什么权限就申请什么权限.但是,在客户交流过程中,我们发现绝大多数企业都是集中式授权,尤其是面向个人的行级权限管控,管理复杂度往往呈几何增长 ...

  7. 项目一:第十三天 1、菜单数据管理 2、权限数据管理 3、角色数据管理 4、用户数据管理 5、在realm中动态查询用户权限,角色 6、Shiro中整合ehcache缓存权限数据

    1 课程计划 菜单数据管理 权限数据管理 角色数据管理 用户数据管理 在realm中动态查询用户权限,角色 Shiro中整合ehcache缓存权限数据         2 菜单数据添加 2.1 使用c ...

  8. WinForm/MIS项目开发之中按钮级权限实践

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  9. 设置SharePoint2010列表的项目级权限

    转:http://www.cfanz.cn/?c=article&a=read&id=24096 在SharePoint2010中我们经常会用到这样的权限设置,在一个列表中可以存储多个 ...

随机推荐

  1. .net 链接oracle

    虽然EF6都快要出来了,但是对于Oracle数据库,仍然只能用DB first和Model First来编程,不能用Code First真是一个很大的遗憾啊. 好了,废话少说,我们来看看EF中是如何用 ...

  2. VB.NET Shared(共享)和 Static(静态)关键字的区别

    共享成员(Shared): VB.NET现在是支持真正的面向对象编程,可以继承.使用多态.共享成员 和静态成员. 共享成员就是在所有类和所定义派生类的实例之间共享的方法.属 性.字段和事件.所有使用类 ...

  3. OpenRisc-40-or1200的MMU模块分析

    引言 MMU(memory management unit),无论对于computer architecture designer还是OS designer,都是至关重要的部分,设计和使用的好坏,对性 ...

  4. HttpClient---------demo

    public class aa { public static void main(String[] args) { // 创建HttpClient实例 HttpClient httpclient = ...

  5. 切记ajax中要带上AntiForgeryToken防止CSRF攻击

    在程序项目中经常看到ajax post数据到服务器没有加上防伪标记,导致CSRF被攻击,下面小编通过本篇文章给大家介绍ajax中要带上AntiForgeryToken防止CSRF攻击,感兴趣的朋友一起 ...

  6. bzoj 1912 : [Apio2010]patrol 巡逻 树的直径

    题目链接 如果k==1, 显然就是直径. k==2的时候, 把直径的边权变为-1, 然后在求一次直径. 变为-1是因为如果在走一次这条边, 答案会增加1. 学到了新的求直径的方法... #includ ...

  7. Scrapy:python3下的第一次运行测试

    1,引言 <Scrapy的架构初探>一文讲解了Scrapy的架构,本文就实际来安装运行一下Scrapy爬虫.本文以官网的tutorial作为例子,完整的代码可以在github上下载. 2, ...

  8. LFS,编译自己的Linux系统 - 前言

    近期工作计划:1. 上班时,用Django编写一个网站:2. 下班时,用C#.WPF编写一个单机版应用软件:3. 其他时间,根据LFS编译自己的Linux系统. LFS是一本书,书中列出了从零开始编译 ...

  9. TensorFlow 深度学习笔记 从线性分类器到深度神经网络

    转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有问题可以到Issue区讨论 官方教程地址 视频/字幕下载 L ...

  10. Ring3 和Ring0 解释

    这得从CPU指令系统(用于控制CPU完成各种功能的命令)的特权级别说起.在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃.比如:清内存.设置时钟等.如果所有的程序都能使用这些 ...