BI技巧丨权限管控

BI可视化在实施过程中,用户最关注的点有哪些?

这个问题相信很多小伙伴都遇到过,或者被其他人问过,白茶总结了一下用户比较在意的几个点:安全性、自助性、权限管控、易用性、兼容性、扩展性、便捷性、反应速度等。

本期呢,我们来聊一聊关于权限管控那些事。

PowerBI截至目前为止,可以实现的权限管控包含三方面:页面权限、行权限、列权限

那么这三者在PowerBI中是如何实现的呢?别急,跟着白茶的思路走。

先来看看本期的案例数据:

案例数据并不是很复杂,共计三张表,分别是权限表、国家表以及案例数据。

将其导入到PowerBI中,我们对权限表进行一下简单的处理。

这是在PowerQuery中关于权限表的截图,大家可以看到页面权限和国家权限采用逗号分割的方式进行存储。

我们需要对这两列进行一下拆分处理。

选择“页面权限”,选择“拆分列”,选择按“分隔符拆分”。

选择“自定义分隔符”,输入文本间的间隔,选择高级选项,选择拆分为“行”。

结果如下:

同理,根据上面的操作,我们将“行权限”进行拆分。

这样做的好处在于,报表正式投入使用后,用户只需要维护Excel文件中的权限配置,PowerBI就会在后台自动执行拆分,进行报表权限控制。

选择关闭并应用,模型如下图。

这里注意一下,权限表不需要与其他表建立模型关系。

白茶根据案例数据,简单的做了如下几个报表。

首页:作为页面权限管控使用,使用字段为权限表中的页面权限字段。

可视化页面:用来展示列权限。

明细页面与地图页面:展示页面权限与行权限使用。

到这里,我们的准备工作基本完成,我们来看一下,三者在PowerBI中的实现方式。

页面权限:

1.报表页面命名与隐藏。

这里大家需要注意,报表页面的名称,一定要与Excel中的文本相对应,不然会导航失败。

当我们配置完成后,除了首页之外的页面,均要设置为隐藏;发布时页面要停留在首页。

2.页面权限配置:选择“管理角色”,选择创建一个角色“页面权限”,在“权限表”输入以下代码。

[邮箱]=USERNAME()

3.页面设置:切片器字段选择权限表中的“页面权限”字段。

添加如下度量值:

页面选择 =
SELECTEDVALUE ( '权限表'[页面权限] )

添加按钮,在“操作”设置中选择类型为“页导航”,点击“fx” 按钮,选择字段值为“页面选择”。

到这里,页面权限配置完成,我们点击面板上的“通过以下身份查看”。

其他用户这里面我们可以输入用户的邮箱进行测试。

我们输入BB测试一下:

可以看到,当我们输入BB邮箱时,切片器会自动的根据用户的权限进行页面筛选。

行权限(RLS):

行权限这个往往代表用户所能看到的数据范围。

1.添加如下度量值:

国家权限 =
VAR CountryAccess =
CALCULATETABLE ( VALUES ( '权限表'[行权限] ), '权限表'[邮箱] = USERNAME () )
RETURN
SELECTEDVALUE ( '国家表'[CountryZH] ) IN CountryAccess

2.在管理角色页面添加新角色如下。

代码如下:

[国家权限]=True()

这样我们能看到的数据范围,就会根据用户的权限进行筛选。

我们在报表页面进行一下简单的查看。

列权限(OLS):

列权限管控,通常代表用户可以看到不同的列。

在PowerBI中,有两种方式可以实现:

A.Tabular Editor的方式。

B.DAX的方式。

这两种方式,A的方式其实白茶不太建议大家去使用。

举个例子:Tabular Editor可以控制某一物理列根据用户权限是否显示,那么这一列,制作报表的过程中,就需要慎用,一旦使用了,某些无权限的用户打开报表时,报表页面就会有部分可视化图表报错,这对用户的体验来说,非常的差。

B的方式,是白茶比较推荐大家的,将列权限写进DAX中,这样更加的灵活。

模拟场景:

若用户是“管理层”,则图表显示“Budget”数据,若用户是“执行层”,则图表显示“Amount”数据。

编写如下DAX:

列权限 =
VAR RoleAccess =
CALCULATETABLE ( VALUES ( '权限表'[角色] ), '权限表'[邮箱] = USERNAME () )
RETURN
IF ( RoleAccess = "管理层", SUM ( '案例数据'[Budget] ), SUM ( '案例数据'[Amount] ) )

将其放入到可视化中,我们来看一下效果。

DAX控制列权限的方式,最佳实践是与SSAS搭配使用,这样可以在Tabular中将列进行隐藏,只呈现DAX给用户,实现真正的OLS管控。

注意事项:

1.权限控制可以在本地部署和云上Servers使用,本机免费版仅可以通过角色进行查看。

2.云上Servers使用最低许可证需要为Pro账号。

3.云上Servers需要将被分享用户添加到对应工作区,权限为“查看器”。且需要在同一组织中。

4.需要对数据集安全性进行设置,将用户邮箱添加到角色里面。

(白茶:文件在知识星球)

这里是白茶,一个PowerBI的初学者。

### 行级安全性 (Row-Level Security) 的实现与应用 行级安全性(Row-Level Security, RLS)是一种数据库特性,允许管理员基于特定条件控制用户访问表中的哪些行。这种机制可以增强数据的安全性和隐私保护。 #### 实现原理 RLS通过定义策略来决定查询操作能够返回的数据行。这些策略通常涉及SQL表达式或函数,用于评估当前用户的权限和其他上下文信息。当执行`SELECT`, `INSERT`, `UPDATE`, 或者 `DELETE`语句时,数据库会自动应用相应的行级安全策略[^1]。 对于MySQL而言,在版本8.0之前并不支持原生的行级安全功能;然而,可以通过其他方式模拟这一行为,比如利用触发器或者存储过程配合视图来达到类似的效果。而在PostgreSQL中,则内置了对RLS的支持,并提供了创建和管理这些策略的方法[^2]。 #### 使用场景举例 假设有一个名为`employees`的人力资源表格,其中包含员工姓名、职位以及部门编号等字段。为了确保不同部门经理只能看到自己团队成员的信息,可以在该表上设置如下所示的一个简单策略: ```sql -- PostgreSQL example for creating an RLS policy on employees table CREATE POLICY dept_manager_policy ON employees USING ((department_id = current_setting('myapp.department', true)::integer)); ``` 上述代码片段展示了如何在PostgreSQL里为`employees`表建立一条规则,使得只有那些属于调用者的部门记录才会被显示出来。这里使用了一个自定义配置参数`current_setting()`来获取当前登录用户的所属部门ID。 #### 编程接口集成 应用程序开发者也可以借助编程语言提供的API来动态调整行级安全策略的应用范围。例如,在Python Flask框架下开发Web服务端口时,可以根据HTTP请求携带的身份验证令牌解析出用户身份并相应地修改会话变量,从而影响后续数据库交互的行为模式。 ```python from flask import g, request import psycopg2 @app.before_request def set_department(): token_info = decode_jwt(request.headers.get('Authorization')) conn = psycopg2.connect(dbname="yourdb", user=g.user) cur = conn.cursor() cur.execute(f"SET myapp.department TO {token_info['dept_id']};") conn.commit() ``` 此段脚本说明了怎样在一个Flask web服务器启动前处理阶段读取JWT认证信息里的部门标识符,并将其设定到PostgreSQL连接环境当中去,以便激活前面提到过的行级别过滤逻辑。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fabric丨白茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值