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

Python Dash基础认证后按登录用户名过滤SQL数据库数据

实现按登录用户过滤SQL数据的Dash应用修改方案

核心思路

  1. 获取当前登录用户名:借助Dash基于Flask的特性,通过flask.request.authorization.username获取已认证的当前用户。
  2. 安全过滤数据:采用参数化SQL查询过滤client_name字段,彻底规避SQL注入风险。

修改后的完整代码

from flask import request
import dash
import dash_auth
from sqlalchemy import create_engine
import pandas as pd

# 请提前定义以下数据库连接参数
driver = '{ODBC Driver 17 for SQL Server}'
server = '你的服务器地址'
database = '你的数据库名'
username = '数据库账号'
password = '数据库密码'

app = dash.Dash(__name__)

# 用户账号密码映射
USERNAME_PASSWORD_PAIRS = {
     'client1': 'client1'
    , 'client2': 'client2'
}

# 基础认证配置
auth = dash_auth.BasicAuth(
    app,
    USERNAME_PASSWORD_PAIRS
)

# 获取当前用户对应的过滤数据集
def get_filtered_data():
    # 获取当前登录用户名
    current_user = request.authorization.username
    
    odbc_params = f'DRIVER={driver};SERVER=tcp:{server};PORT=1433;DATABASE={database};UID={username};PWD={password}'
    connection_string = f'mssql+pyodbc:///?odbc_connect={odbc_params}'
    engine = create_engine(connection_string)
    
    # 参数化查询,避免SQL注入
    query = "SELECT * FROM [dbo].[test] WHERE client_name = :username"
    df = pd.read_sql(query, engine, params={'username': current_user})
    
    engine.dispose()
    return df

# 加载当前用户专属数据集
df = get_filtered_data()

# 后续可视化组件直接使用df即可,已自动过滤当前用户数据

关键注意事项

  • 参数化查询必须遵守:严禁直接将用户名拼接到SQL字符串中(如f"SELECT * FROM test WHERE client_name = '{current_user}'"),这种写法会引发严重的SQL注入漏洞。
  • 账号与字段值匹配:确保USERNAME_PASSWORD_PAIRS中的用户名,和数据库client_name字段的取值完全一致,否则会返回空数据集。
  • 动态数据加载:若应用支持用户切换登录,可将数据加载逻辑放到回调函数中,保证每次用户访问时都重新获取对应的数据。

内容的提问来源于stack exchange,提问作者Gabriel Bou Karam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:15:16