如何在Qlik Sense中基于位置层级实现Section Access数据级安全
Qlik Sense Section Access配置方案:基于位置层级与用户权限的数据过滤
没问题,我帮你梳理一套完全贴合需求的Qlik Sense Section Access配置方案,覆盖位置层级关联、用户权限过滤,还有离职用户(NULL字段)的特殊场景:
1. 核心规则对齐
先把你的需求拆解确认,确保配置精准匹配:
- 位置层级链(从低到高):
Beed→Jalgaon→Yawatmal→Pune→Maharashtra - Level1用户权限:
- Dharmesh:仅查看
Jalgaon及其子节点Beed的数据 - Mahesh:仅查看
Jalgaon及其子节点Nagpur的数据
- Dharmesh:仅查看
- 上级用户Nikhil:查看所有下级位置(
Pune、Yawatmal、Jalgaon、Nagpur、Beed)的全部数据,包括下属用户(即使下属用户字段为NULL)
2. 核心表结构设计
你需要准备两个基础映射表,用来支撑权限逻辑:
(1)用户-位置根节点映射表(User_Location_Map)
记录每个用户对应的可访问根位置,同时处理离职用户的归属:
| UserID | RootLocation |
|---|---|
| Dharmesh | Jalgaon |
| Mahesh | Jalgaon |
| Nikhil | Maharashtra |
| NULL | Jalgaon |
(2)位置层级关系表(Location_Hierarchy)
构建位置的上下级关联,方便递归获取所有子节点:
| Location | ParentLocation |
|---|---|
| Beed | Jalgaon |
| Nagpur | Jalgaon |
| Jalgaon | Yawatmal |
| Yawatmal | Pune |
| Pune | Maharashtra |
| Maharashtra | NULL |
3. Section Access脚本实现
把这段脚本放在Qlik Sense数据加载编辑器的最开头(Section Access必须优先加载),注意所有权限字段要大写(Qlik对Section Access字段大小写敏感):
// 启动Section Access权限控制 Section Access; // 第一步:生成每个用户可访问的所有位置(递归获取子节点) LOAD Upper(UserID) as USERID, // 统一转大写,避免大小写匹配问题 Location as LOCATION ; // 先加载用户-根位置映射 LOAD UserID, RootLocation as Location Resident User_Location_Map; // 递归关联位置层级表,获取所有子位置 Join LOAD ulm.UserID, lh.Location Resident Location_Hierarchy lh Inner Join (LOAD * Resident User_Location_Map) LOAD ulm.UserID, ulm.RootLocation as ParentLocation Resident User_Location_Map ulm Where Exists(ParentLocation, lh.ParentLocation); // 第二步:配置应用访问权限(给用户分配基础访问权限) LOAD Upper(UserID) as USERID, 'USER' as ACCESS // 普通用户用USER,管理员可以设为ADMIN Resident User_Location_Map; // 结束Section Access,回到业务数据加载 Section Application; // 加载业务数据时,通过Exists函数过滤用户有权限的位置 LOAD Location, User, // 这里添加你的其他业务字段 Sales, Date From [你的业务数据源路径] Where Exists(LOCATION, Location); // 仅加载用户权限范围内的位置数据
4. NULL用户场景的特殊处理
针对业务数据中User字段为NULL的情况,我们已经通过User_Location_Map里的NULL用户映射确保上级能看到这些数据。如果需要更精准控制,可以在业务数据加载时标记特殊值:
LOAD Location, If(User is Null, 'INACTIVE_USER', User) as User, Sales, Date From [你的业务数据源路径];
5. 验证与注意事项
- 测试时用对应用户登录:比如Dharmesh登录后,检查是否只能看到
Jalgaon和Beed的数据;Nikhil登录后能看到所有下级位置的全部数据 - 如果使用AD域用户,
USERID必须和AD用户名完全一致(比如DOMAIN\DHARMESH,转大写后匹配) - 若位置层级更深,可以用循环加载的方式实现递归,确保所有子节点都被包含
- 记得在Qlik Sense的应用设置里开启“Section Access”权限控制
内容的提问来源于stack exchange,提问作者Ipsita Mahapatra
相关产品推荐
相关产品推荐

