最近忽然对SSAS产生了浓厚兴趣,我看博客园上也米有写关于SSAS 2016下表格模型实现动态权限管理的文章,最近鼓捣了一下微软的样例,鼓捣好了,把过程中遇到的一些问题写出来,抛砖引玉,也算给自己一个交代。

首先放出微软官网的教程:

https://docs.microsoft.com/zh-cn/power-bi/desktop-tutorial-row-level-security-onprem-ssas-tabular?from=singlemessage&isappinstalled=0

要点主要是SSAS Tabular表格模型在SSAS 2016之后多加了2个DAX函数,分别是username()和lookupvalue(),配合使用就可以返回需要在dim表中过滤的Key值,从而过滤返回结果的范围,本质上还是行筛选器的应用。

在微软的样例中,DAX表达式=DimSalesTerritory[SalesTerritoryKey]=LOOKUPVALUE(DimUserSecurity[SalesTerritoryID], DimUserSecurity[UserName], USERNAME(), DimUserSecurity[SalesTerritoryID], DimSalesTerritory[SalesTerritoryKey])的返回值只有一个,因为在配置表中这名用户只有一个区域Key,如果用户配置成了拥有多个区域的Key,也就是配置表中拥有多行记录,那么返回函数会返回多个Key值,无需修改DAX表达式。

所以我们依然需要在设计模型的时候添加角色,在角色中添加真正的用户,但是这个角色的含义是所有权限需要动态控制的用户的列表,理论上会添加很多人,但是只要添加好一次,在因为业务原因权限发生变动的时候,就无需重新修改和部署这个Tabular表格模型中的角色了。

还有一个需要注意的点是,我们在SSDT中开发Tabular表格模型项目的时候,需要本身运行SSDT的账号在SSAS实例下拥有admin权限,但是admin权限过大了,不会受到模型中角色的权限限制,这个无论是静态写死的角色还是动态赋权的角色都是如此,也符合微软一贯的权限管理模型模式,即管理员不受任何权限控制。那么如何在SSDT中使用在excel中测试这个选项来测试角色权限呢?过程有些曲折但是确实可行,我已经在我本地测试成功了,步骤如下:

1.使用ssas下具有admin权限的用户在SSDT中开发设计模型完毕,rebuild all success,然后关闭项目;

2.run as different user打开SSDT不好使,因为你run as different user确实打开了另一个用户上下文的SSDT,但是到使用execl中测试这个功能的时候,就是你当前登陆桌面使用的用户了,不是SSDT中你run as different那个了;

3.所以需要用真正需要测试权限的用户登陆项目所在机器的RDP,打开SSDT,process数据,但是又遇到权限不够的问题无法打开项目的问题,怎么办?

4.临时将需要测试权限的用户在SSAS中赋予admin权限,使这名用户可以成功在SSDT中打开项目,process数据,标志是可以在SSDT中看到数据行;

5.填充完数据之后,把这个普通用户的SSAS admin权限拿掉,然后再点击按钮,使用在excel中测试,用户名就选当前用户;

6.如果之前的模型设计,权限设置,行筛选器都配置的没有问题,那么在新打开的excel中就能看到过滤后的效果了。

所以动态权限的管理,无论是在多维数据集模型下还是在表格模型下,都是从dim 表中各个在事实表中关联的Key值上下手,首先想办法知道当前点开这个报表的人是谁,然后查找权限表,看这个人拥有哪些key值,然后只给他看他拥有key值的那些数据。

在权限表的设计上其实也有门道,因为这个权限表实际上是存在于SQL Server或者其他关系数据库里面的一张普通表,如何确保这个表的内容不被篡改?在拥有多个需要控制权限的维度时产生的大量笛卡儿积数据如何存放和维护?我本人的做法是,每一个模型中的dim表,专门设置一个权限表,比如模型中,fact表中有10个dim表的key值,那么至多我就会设计10个权限表,每个表单独维护,然后创建权限视图,把这10个表按照username()的返回值join起来,不丢任何一个列和行,然后在SSAS模型中添加这个权限视图,再跟fact表根据key值产生关联。

别问有没有图了,没图,微软的样例图很多。

BR

SSAS Tabular表格模型实现动态权限管理的更多相关文章

  1. SSAS Tabular 表格模型建模(关系)及部署

    一.表格建模(SSAS 表格)   表格模型是 Analysis Services 中的内存中数据库. 使用最先进的压缩算法和多线程查询处理器,xVelocity 内存中分析引擎 (VertiPaq) ...

  2. Android 6.0 - 动态权限管理的解决方案

    Android 6.0版本(Api 23)推出了很多新的特性, 大幅提升了用户体验, 同时也为程序员带来新的负担. 动态权限管理就是这样, 一方面让用户更加容易的控制自己的隐私, 一方面需要重新适配应 ...

  3. Android 6.0 - 动态权限管理的解决方案(转)

    转自:http://www.cnblogs.com/dubo-/p/6018262.html Android 6.0 - 动态权限管理的解决方案   转载请标注 Android 6.0版本(Api 2 ...

  4. SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理|前后端分离(下)----筑基后期

    写在前面 在上一篇文章<SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理(上)----筑基中期>当中,我们初步实现了SpringBoot整合Shiro ...

  5. spring boot:spring security用mysql实现动态权限管理(spring boot 2.3.3)

    一,动态权限管理的优点和缺点 1,优点: 因为控制权限的数据保存在了mysql或其他存储系统中, 可以动态修改权限控制,无需改动代码和重启应用,  权限变更时灵活方便 2,缺点: 权限的设置需要保存在 ...

  6. PowerBI 实现不同角色看到内容不同支持动态权限管理

    首先,在PowerBIDesktop中进行设计,先设计一个权限表: 具体权限如下: 也就是说,这些用户账号在PowerBIService登录时,会分别代表这些用户,接下来会使用一个很重要的动态函数:U ...

  7. SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理(上)----筑基中期

    写在前面 通过前几篇文章的学习,我们从大体上了解了shiro关于认证和授权方面的应用.在接下来的文章当中,我将通过一个demo,带领大家搭建一个SpringBoot整合Shiro的一个项目开发脚手架, ...

  8. Android_动态权限管理的解决方式

    本博文为子墨原创.转载请注明出处! http://blog.csdn.net/zimo2013/article/details/50478201 1.前言 (1).因为MIUI等部分国产定制系统也有权 ...

  9. shiro实现动态权限管理

    用到shiro框架实现权限控制时,根据实际要求,权限在数据库增删改后都要把权限过滤链变化实时更新到服务器中. 1.配置文件里配置的filterchains都是静态的,但实际开发中更多的是从数据库中动态 ...

随机推荐

  1. 解决 npm run dev b报错 “'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件。”

    摘自:https://www.cnblogs.com/laraLee/p/9174383.html 前提: 电脑已经安装了nodeJS和npm,  项目是直接下载的zip包. 在项目目录下运行“npm ...

  2. HDU 1711 Number Sequence (KMP 入门)

    Number Sequence Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and ...

  3. 最短路算法(floyed+Dijkstra+bellman-ford+SPFA)

    最短路算法简单模板 一.floyed算法 首先对于floyed算法来说就是最短路径的动态规划解法,时间复杂度为O(n^3) 适用于图中所有点与点之间的最短路径的算法,一般适用于点n较小的情况. Flo ...

  4. linux内存池

    在内核中有不少地方内存分配不允许失败. 作为一个在这些情况下确保分配的方式, 内核 开发者创建了一个已知为内存池(或者是 "mempool" )的抽象. 一个内存池真实地只是一 类 ...

  5. Python的优缺点、以及解释器种类

    优点 Python起始定位“优雅”.“明确”.“简洁”,工具型语言,上手快,实用性强. 开发效率高,支持库强大,很多功能都有与之对应的最优模块支持. 高级语言,编程时无需考虑内存等底层具体实现. 可移 ...

  6. redisUtil

    package com.cinc.ecmp.utils; import org.springframework.beans.factory.annotation.Autowired; import o ...

  7. tcp短连接和长连接

    1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次 ...

  8. TCP/IP Basic

    1.概述 TCP/IP起源于60年代美国政府遮住的一个分组交换网络项目,在当今被定义为互联网通信接口,TCP/IP主要分为4层,每一层负责不同的通信功能,这促成了一个协议族的诞生,而TCP/IP是一组 ...

  9. .NetCore集成Dapr踩坑经历

    该篇内容由个人博客点击跳转同步更新!转载请注明出处 前言 之前自己有个core2.2的项目一直是用的Surging作为微服务框架的,后来了解到了Dapr,发现比较轻量级,开发部署等也非常方便,故将自己 ...

  10. Volatile是用于解决什么问题,谈谈实现原理

    一.volatile的作用 通常情况下我们可以通过Synchronized关键字来解决这些个问题,不过如果对Synchronized原理有了解的话,应该知道Synchronized是一个比较重量级的操 ...