Python Dash基础认证后按登录用户名过滤SQL数据库数据
实现按登录用户过滤SQL数据的Dash应用修改方案
核心思路
- 获取当前登录用户名:借助Dash基于Flask的特性,通过
flask.request.authorization.username获取已认证的当前用户。 - 安全过滤数据:采用参数化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
相关产品推荐
相关产品推荐

