superset行级权限修改

本文介绍了如何在Superset中实现数据权限的管理,根据用户机构代码展示不同数据。首先在viz.py中添加默认的where条件,然后引入获取当前登录用户的方法,根据用户身份设置不同的筛选条件。接着,将权限信息存储到数据库中,通过在ab_user表增加字段并绑定到User模型。最后,在用户创建和修改界面添加机构权限输入框,允许用户选择自己的机构权限。这使得数据权限更加灵活且易于管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6 根据机构代码显示不同数据
  6.1修改viz.py 添加默认where条件      
  extras = {
            'where':'comcode="5100000"',
            'having': form_data.get('having', ''),
            'having_druid': form_data.get('having_filters', []),
            'time_grain_sqla': form_data.get('time_grain_sqla', ''),
            'druid_time_origin': form_data.get('druid_time_origin', ''),
        }
        
  修改这个地方 就可以在dashboard加载时指定数据机构


  6.2修改viz.py 引入取当前登陆用户的方法
  from superset.jinja_context import current_username 
  然后就可以print(current_username()) 得到当前用户
   
  那么我们就可以在这里添加一个判断来对用户做判断并为条件赋值 
        #print(current_username())
        #print("==================================================")
        current_user = current_username()
        if current_user == "2222":
           comcodelike = 'comcode like "51%"'
        elif current_user == "11111":
           comcodelike = 'comcode like "510%"'
        else:
           comcodelike = 'comcode like "511%"'

        print(comcodelike)
        extras = {
            'where':comcodelike,
#            'where':'where comcode="510000"'.strp('\n'),
            'having': form_data.get('having', ''),
            'having_druid': form_data.get('having_filters', []),
            'time_grain_sqla': form_data.get('time_grain_sqla', ''),
            'druid_time_origin': form_data.get('druid_time_origin', ''),
        }
        print(extras)  
   
   6.3 将权限放到数据库中管理
      a 在superset 的 ab_user表增加字段 comcode 并赋值
      b 在flask_appbuilder/security/sqla/models.py 的class User(Model): 添加字段comcode ,做好数据库的绑定
      c 然后在 superset/viz.py中 用g.user.comcode 就可以取到值了 
   
   6.4 最终viz.py效果
    from flask import escape, request, g  这里添加 ,g 引入flask 的全局变量,用于取当前登录用户的信息
        current_comcode = g.user.comcode                                           #取当前登陆用户的机构
        comcodelike = 'comcode like "' +  current_comcode +'%"'          #字符串连接 拼接where条件


        extras = {
            'where':comcodelike,
            'having': form_data.get('having', ''),
            'having_druid': form_data.get('having_filters', []),
            'time_grain_sqla': form_data.get('time_grain_sqla', ''),
            'druid_time_origin': form_data.get('druid_time_origin', ''),
        }
 

6.5 将数据权限在前台修改及创建用户的页面添加输入框
    这里需要在flask_appbuilter端修改
    首先修改 flask_appbuilder/security/views.py 文件
        找到 UserModelView等 与User有关的类
        然后仿造email等字段添加comcode字段 即可。
    class UserModelView(ModelView):
    route_base = '/users'
    
    list_title = lazy_gettext('List Users')
    show_title = lazy_gettext('Show User')
    add_title = lazy_gettext('Add User')
    edit_title = lazy_gettext('Edit User')
                     
    label_columns = {'get_full_name': lazy_gettext('Full Name'),
                     'first_name': lazy_gettext('First Name'),
                     'last_name': lazy_gettext('Last Name'),
                     'username': lazy_gettext('User Name'),
                     'password': lazy_gettext('Password'),
                     'active': lazy_gettext('Is Active?'),
                     'email': lazy_gettext('EMail'),
                     'roles': lazy_gettext('Role'),
                     'comcode':lazy_gettext('机构权限'),
                     'last_login': lazy_gettext('Last login'),
                     'login_count': lazy_gettext('Login count'),
                     'fail_login_count': lazy_gettext('Failed login count'),
                     'created_on': lazy_gettext('Created on'),
                     'created_by': lazy_gettext('Created by'),
                     'changed_on': lazy_gettext('Changed on'),
                     'changed_by': lazy_gettext('Changed by')}    
    description_columns = {'first_name': lazy_gettext('Write the user first name or names'),
                           'last_name': lazy_gettext('Write the user last name'),
                           'username': lazy_gettext(
                               'Username valid for authentication on DB or LDAP, unused for OID auth'),
                           'password': lazy_gettext(
                               'Please use a good password policy, this application does not check this for you'),
                           'active': lazy_gettext('It\'s not a good policy to remove a user, just make it inactive'),
                           'email': lazy_gettext('The user\'s email, this will also be used for OID auth'),
                           'roles': lazy_gettext(
                               'The user role on the application, this will associate with a list of permissions'),
                           'comcode':lazy_gettext('机构权限,多机构以逗号单引号分开'),
                           'conf_password': lazy_gettext('Please rewrite the user\'s password to confirm')}

    list_columns = ['first_name', 'last_name', 'username', 'email', 'active', 'roles','comcode']

    show_fieldsets = [
        (lazy_gettext('User info'),
         {'fields': ['username', 'active', 'roles', 'login_count']}),
        (lazy_gettext('Personal Info'),
         {'fields': ['first_name', 'last_name', 'email'], 'expanded': True}),
        (lazy_gettext('Audit Info'),
         {'fields': ['last_login', 'fail_login_count', 'created_on',
                     'created_by', 'changed_on', 'changed_by'], 'expanded': False}),
    ]

    user_show_fieldsets = [
        (lazy_gettext('User info'),
         {'fields': ['username', 'active', 'roles', 'login_count']}),
        (lazy_gettext('Personal Info'),
         {'fields': ['first_name', 'last_name', 'email'], 'expanded': True}),
    ]

    search_exclude_columns = ['password']

    add_columns = ['first_name', 'last_name', 'username', 'active', 'email', 'roles','comcode']
    edit_columns = ['first_name', 'last_name', 'username', 'active', 'email', 'roles','comcode']

class UserDBModelView(UserModelView):
    """
        View that add DB specifics to User view.
        Override to implement your own custom view.
        Then override userdbmodelview property on SecurityManager
    """
    add_form_extra_fields = {'password': PasswordField(lazy_gettext('Password'),
                                                       description=lazy_gettext(
                                                           'Please use a good password policy, this application does not check this for you'),
                                                       validators=[validators.DataRequired()],
                                                       widget=BS3PasswordFieldWidget()),
                             'conf_password': PasswordField(lazy_gettext('Confirm Password'),
                                                            description=lazy_gettext(
                                                                'Please rewrite the user\'s password to confirm'),
                                                            validators=[EqualTo('password', message=lazy_gettext(
                                                                'Passwords must match'))],
                                                            widget=BS3PasswordFieldWidget())}

    add_columns = ['first_name', 'last_name', 'username', 'active', 'email', 'roles','comcode', 'password', 'conf_password']        

### 如何在 Apache Superset 中使用 Jinja 模板进动态查询或配置 Apache Superset 支持通过 Jinja 模板实现动态 SQL 查询。这种功能允许用户根据上下文变量生成动态的 SQL 语句,从而增强查询的灵活性和可扩展性。以下是具体实现方式及相关细节: #### 配置 Jinja 上下文 在 Superset 的配置文件中,可以通过 `JINJA_CONTEXT_ADDONS` 参数添加自定义的 Jinja 上下文变量。例如,以下代码片段展示了如何定义一个名为 `my_crazy_macro` 的宏函数[^1]: ```python JINJA_CONTEXT_ADDONS = { 'my_crazy_macro': lambda x: x * 2, } ``` 上述配置将 `my_crazy_macro` 添加到 Jinja 上下文中,使其可以在 SQL 查询中被调用。 #### 在 SQL 查询中使用 Jinja 模板 Superset 的 SQL Lab 和 Explore 功能支持 Jinja 模板语法[^2]。用户可以在 SQL 查询中嵌入 Jinja 表达式,以实现动态内容生成。以下是一个示例 SQL 查询,展示了如何使用 Jinja 模板: ```sql SELECT * FROM sales WHERE date >= '{{ yesterday_ds }}' AND date <= '{{ today_ds }}' AND value > {{ my_crazy_macro(10) }} ``` - `{{ yesterday_ds }}` 和 `{{ today_ds }}` 是 Superset 内置的 Jinja 变量,分别表示昨天和今天的日期。 - `{{ my_crazy_macro(10) }}` 调用了前面定义的自定义宏函数,返回值为 `20`。 #### 动态参数的来源 Jinja 模板中的动态参数可以来自多个来源: 1. **内置变量**:如 `yesterday_ds`、`today_ds` 等,由 Superset 自动提供。 2. **自定义上下文**:通过 `JINJA_CONTEXT_ADDONS` 配置的变量。 3. **仪表盘过滤器**:用户可以在仪表盘中设置过滤器,并将其值传递给 SQL 查询。 4. **URL 查询参数**:通过 URL 传递的参数也可以作为 Jinja 模板的上下文变量。 #### 示例:结合仪表盘过滤器使用 Jinja 模板 假设有一个仪表盘,用户可以通过过滤器选择特定的日期范围。以下 SQL 查询展示了如何结合仪表盘过滤器使用 Jinja 模板: ```sql SELECT * FROM orders WHERE order_date >= '{{ dashboard_filters.get("start_date") }}' AND order_date <= '{{ dashboard_filters.get("end_date") }}' ``` 在此示例中,`dashboard_filters` 是 Superset 提供的一个特殊对象,用于访问仪表盘过滤器的值[^3]。 #### 注意事项 1. **安全性**:Jinja 模板的使用可能带来安全风险(如代码注入)。确保对用户输入进严格验证。 2. **性能**:动态查询可能影响查询性能,建议优化 SQL 并合理使用缓存机制。 3. **调试**:如果查询未按预期执,可以通过 Superset 的日志功能检查生成的最终 SQL。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值