Superset 2.0.1嵌入仪表盘权限不符及GuestUser报错求助
Superset 2.0.1 嵌入仪表盘权限异常与GuestUser报错解决
问题概述
- 已创建自定义角色并分配权限给指定用户,直接登录Superset时权限正常生效,但嵌入仪表盘时,该用户在图表控件中仍拥有未分配的
view query权限。 - 嵌入仪表盘时触发500内部错误,Superset日志提示
'GuestUser' object has no attribute 'get_user_id'。
错误日志
Superset服务端日志
2023-02-13 16:31:00,516:ERROR:root:'GuestUser' object has no attribute 'get_user_id' Traceback (most recent call last): File "/home/ubuntu/Desktop/main_project/binary_superset_file/binary_ss_env/lib/python3.8/site-packages/flask_appbuilder/api/__init__.py", line 86, in wraps return f(self, *args, **kwargs) File "/home/ubuntu/Desktop/main_project/binary_superset_file/binary_ss_env/lib/python3.8/site-packages/superset/utils/log.py", line 245, in wrapper value = f(*args, **kwargs) File "/home/ubuntu/Desktop/main_project/binary_superset_file/binary_ss_env/lib/python3.8/site-packages/superset/dashboards/filter_state/api.py", line 98, in post return super().post(pk) File "/home/ubuntu/Desktop/main_project/binary_superset_file/binary_ss_env/lib/python3.8/site-packages/superset/views/base_api.py", line 83, in wraps return f(self, *args, **kwargs) File "/home/ubuntu/Desktop/main_project/binary_superset_file/binary_ss_env/lib/python3.8/site-packages/superset/temporary_cache/api.py", line 76, in post key = self.get_create_command()(args).run() File "/home/ubuntu/Desktop/main_project/binary_superset_file/binary_ss_env/lib/python3.8/site-packages/superset/temporary_cache/commands/create.py", line 35, in run return self.create(self._cmd_params) File "/home/ubuntu/Desktop/main_project/binary_superset_file/binary_ss_env/lib/python3.8/site-packages/superset/dashboards/filter_state/commands/create.py", line 41, in create entry: Entry = {"owner": get_owner(actor), "value": value} File "/home/ubuntu/Desktop/main_project/binary_superset_file/binary_ss_env/lib/python3.8/site-packages/superset/key_value/utils.py", line 70, in get_owner return user.get_user_id() if not user.is_anonymous else None AttributeError: 'GuestUser' object has no attribute 'get_user_id' 2023-02-13 16:31:00,533:INFO:werkzeug:127.0.0.1 - - [13/Feb/2023 16:31:00] "POST /api/v1/dashboard/11/filter_state?tab_id=1 HTTP/1.1" 500 -
浏览器控制台日志
POST http://127.0.0.1:8088/api/v1/dashboard/11/filter_state?tab_id=1 500 (INTERNAL SERVER ERROR) Response {type: 'basic', url: 'http://127.0.0.1:8088/api/v1/dashboard/11/filter_state?tab_id=1', redirected: false, status: 500, ok: false, …}
解决方法
1. 修复GuestUser的get_user_id属性缺失问题
这是Superset 2.0.1的已知bug,GuestUser类未实现get_user_id方法,但过滤器状态API尝试调用该方法。可通过以下两种方式修复:
方式一:修改get_owner函数
编辑superset/key_value/utils.py文件,找到get_owner函数,修改为:
def get_owner(user: User) -> Optional[str]: """ Get the owner identifier for a user. """ if user.is_anonymous: return None # Handle GuestUser which doesn't have get_user_id return user.get_user_id() if hasattr(user, 'get_user_id') else None
方式二:给GuestUser类添加get_user_id方法
编辑superset/security/guest_user.py文件,在GuestUser类中添加方法:
def get_user_id(self) -> Optional[int]: return None
修改后重启Superset服务即可解决500错误。
2. 修复嵌入模式下权限异常问题
嵌入模式默认使用GuestUser身份,而非你分配权限的指定用户,导致权限不一致。可通过以下方式处理:
- 启用JWT认证传递用户身份:配置Superset使用JWT认证,在嵌入链接中携带用户的JWT token,确保嵌入时使用指定用户的角色和权限,而非GuestUser。
- 调整GuestUser权限:如果必须使用GuestUser,在Superset角色管理中修改
Guest角色的权限,移除view query权限,确保嵌入时权限符合预期。 - 检查PUBLIC_ROLE_LIKE_GUEST配置:在
superset_config.py中确认PUBLIC_ROLE_LIKE_GUEST的设置,若设为True,公共角色会继承Guest角色权限,需根据需求调整。
内容的提问来源于stack exchange,提问作者Ceelamkoti Vinod
相关产品推荐
相关产品推荐

