Power BI嵌入Liferay实现登录用户数据权限控制问题咨询
解决方案:Power BI报表嵌入Liferay并实现用户级数据过滤
核心问题说明
你遇到的登录提示本质是**「发布到Web」功能的局限性**:该功能仅用于公开无权限限制的报表嵌入,不支持传递用户身份上下文,因此无法配合RLS(行级别安全)实现基于Liferay登录用户的个性化数据过滤。只要报表配置了RLS,通过「发布到Web」嵌入时必然会触发登录验证,因为RLS需要明确的用户身份来执行过滤规则。
要实现需求,需改用Power BI企业级嵌入方案,结合RLS和身份传递来完成,具体步骤如下:
步骤1:正确配置RLS规则
在Power BI Desktop中完成RLS的基础配置:
- 打开报表,切换到「建模」选项卡,点击「管理角色」
- 创建新角色(例如命名为
LiferayAuthenticatedUser) - 针对数据模型中的业务表添加过滤规则:
- 如果用用户邮箱作为标识:
[用户邮箱字段] = USERPRINCIPALNAME() - 如果用Liferay用户ID作为标识,且模型中有邮箱与ID的映射表:
[用户ID字段] = LOOKUPVALUE('用户映射表'[UserID], '用户映射表'[Email], USERPRINCIPALNAME())
- 如果用用户邮箱作为标识:
- 验证规则:点击「查看为角色」,选择创建的角色并输入测试用户邮箱,确认数据过滤符合预期
步骤2:发布报表到Power BI服务并配置权限
- 将报表发布到你的Power BI工作区(建议使用Premium容量工作区,避免每个Liferay用户都需要Power BI Pro许可证)
- 在Power BI服务中,进入报表所在工作区:
- 确认RLS角色已同步生效
- 给用于嵌入的服务主体(或Liferay集成应用)分配「成员」或「参与者」权限
- 开启工作区的「允许嵌入」设置(在工作区设置的「嵌入」选项中配置)
步骤3:Liferay中嵌入报表并传递用户身份
根据Liferay的身份体系选择对应嵌入方式:
方式A:Liferay用户已同步到Azure AD
如果Liferay使用Azure AD做身份验证,直接采用**「用户拥有的数据」嵌入方式**:
- 在Liferay中开发嵌入组件,获取当前登录用户的UPN(用户主体名称,即邮箱)
- 使用Power BI JavaScript SDK加载报表,自动传递用户身份,RLS会基于
USERPRINCIPALNAME()自动过滤数据
方式B:Liferay用户未同步到Azure AD
采用**「应用拥有的数据」嵌入方式**,通过自定义身份传递实现:
- 修改RLS规则,改用
CUSTOMDATA()函数获取传递的用户标识:[用户ID字段] = CUSTOMDATA() - 在Liferay中调用Power BI REST API生成嵌入令牌,将当前登录用户的ID或邮箱作为
customData参数传入 - 使用生成的嵌入令牌通过Power BI JavaScript SDK加载报表,RLS会基于
CUSTOMDATA()的值过滤数据
关键注意事项
- 彻底放弃「发布到Web」功能,该方案不支持任何身份相关的权限控制
- 若使用Power BI Pro工作区,每个查看报表的Liferay用户都需要拥有Power BI Pro许可证;若使用Premium容量,仅需容量许可,无需用户单独授权
- 确保Liferay与Power BI之间的身份传递逻辑安全,避免用户标识泄露
内容的提问来源于stack exchange,提问作者Deepam
相关产品推荐
相关产品推荐

