You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Superset扩展User模型:自定义属性存储与Jinja宏问题

问题解决:Keycloak自定义属性存入Superset用户模型及Jinja宏传递参数

一、确保Keycloak自定义属性存入Superset数据库

你已经扩展了User模型并添加了custom_attribute字段,但登录时未存入,核心原因是Superset默认的用户信息转换逻辑不会处理自定义字段,需要做以下调整:

  1. 确认自定义模型与安全管理器的注册
    在superset_config.py中必须添加这两行配置,确保Superset加载你的自定义实现:

    AUTH_USER_MODEL = CustomUser
    CUSTOM_SECURITY_MANAGER = CustomSsoSecurityManager
    
  2. 重写_user_info_to_user方法处理自定义字段
    修改CustomSsoSecurityManager类,补充自定义属性的赋值逻辑——默认方法只会同步内置字段(用户名、邮箱等),重写后才能覆盖这个逻辑:

    class CustomSsoSecurityManager(SupersetSecurityManager):
        authoauthview = CustomSsoAuthOAuthView
    
        def oauth_user_info(self, provider, res=None):
            # 保留你原有的oauth_user_info代码...
    
        def _user_info_to_user(self, userinfo):
            # 先调用父类方法处理默认字段
            user = super()._user_info_to_user(userinfo)
            # 将自定义属性映射到用户模型
            if 'custom_attribute' in userinfo:
                user.custom_attribute = userinfo['custom_attribute']
            return user
    
  3. 验证Keycloak返回的字段正确性
    确认Keycloak的userinfo端点确实返回customAttribute字段:

    • 登录Keycloak控制台,进入对应客户端的「客户端范围」,将自定义属性添加到「用户属性映射」,并设置为包含在userinfo响应中。
    • 可以直接调用Keycloak的userinfo接口(如http://<keycloak地址>/realms/<你的领域>/protocol/openid-connect/userinfo),检查返回JSON中是否存在该字段。
  4. 重启服务测试
    修改配置后重启Superset,用目标Keycloak用户登录,查看ab_user表的custom_attribute字段是否已填充值。

二、自定义Jinja宏在SQL Lab传递customAttribute参数

可以通过扩展Superset的Jinja上下文实现,也可以封装成自定义宏,步骤如下:

  1. 注入自定义属性到Jinja上下文
    在superset_config.py中定义上下文扩展函数,将当前用户的自定义属性加入Jinja环境:

    def jinja_context_extra(context):
        user = context.get('user')
        return {
            'custom_attribute': getattr(user, 'custom_attribute', None)
        }
    
    JINJA_CONTEXT_ADDONS = jinja_context_extra
    
  2. 自定义Jinja宏(可选)
    若需要封装成可复用的宏,创建宏文件(比如superset/templates/jinja_macros/custom_macros.html):

    {% macro get_user_custom_attr() %}
        {{ custom_attribute if custom_attribute is not none else 0 }}
    {% endmacro %}
    

    然后在superset_config.py中配置宏路径:

    JINJA_MACROS_PATH = ['superset/templates/jinja_macros']
    
  3. 在SQL Lab中使用

    • 直接使用变量:SELECT * FROM your_table WHERE filter_col = {{ custom_attribute }}
    • 使用自定义宏:SELECT * FROM your_table WHERE filter_col = {{ get_user_custom_attr() }}

内容的提问来源于stack exchange,提问作者StarkSlasher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:15:58