streamlit_supabase_auth_ui 是一个基于 Streamlit 框架和 Supabase 认证服务的用户界面组件库。它为开发者提供了一套开箱即用的认证UI组件,可以快速集成到Streamlit应用中,实现用户注册、登录、密码重置等常见认证功能。
我在实际项目中多次使用这个库,发现它特别适合需要快速搭建带用户系统的数据应用场景。相比从头开发认证系统,它能节省至少80%的开发时间,同时保持与Supabase后端的无缝集成。
这个库提供了多个可直接使用的认证UI组件:
每个组件都遵循Material Design风格,支持自定义主题颜色。例如创建一个登录表单只需:
python复制from streamlit_supabase_auth_ui import login_form
login_form(
supabase_url="YOUR_SUPABASE_URL",
supabase_key="YOUR_SUPABASE_KEY",
providers=["google", "github"]
)
组件内置了完整的认证状态管理逻辑,开发者可以通过以下方式获取当前用户信息:
python复制from streamlit_supabase_auth_ui import get_auth
auth = get_auth()
if auth:
st.write(f"欢迎, {auth['user']['email']}")
支持通过OAuth集成多种第三方登录方式,包括:
只需在初始化时指定providers参数即可启用对应登录方式。
组件库底层使用Supabase JavaScript客户端库进行认证操作。关键交互流程包括:
认证状态通过以下方式持久化:
组件库实现了多项安全措施:
典型集成步骤:
bash复制pip install streamlit-supabase-auth-ui
code复制SUPABASE_URL=your_url
SUPABASE_KEY=your_key
python复制import os
from streamlit_supabase_auth_ui import login_form
login_form(
supabase_url=os.getenv("SUPABASE_URL"),
supabase_key=os.getenv("SUPABASE_KEY")
)
所有组件支持通过theme参数自定义外观:
python复制login_form(
...,
theme={
"primary": "#4CAF50",
"text": "#FFFFFF",
"background": "#121212"
}
)
可以通过validation_rules参数添加表单验证:
python复制login_form(
...,
validation_rules={
"email": {
"required": "邮箱不能为空",
"pattern": {
"value": r"^\S+@\S+$",
"message": "请输入有效的邮箱地址"
}
}
}
)
组件提供多个事件钩子用于扩展功能:
python复制def on_login(auth_data):
st.success(f"用户 {auth_data['user']['email']} 登录成功")
login_form(..., on_login=on_login)
对于大型应用,建议按需加载认证组件:
python复制if "auth" not in st.session_state:
from streamlit_supabase_auth_ui import login_form
login_form(...)
可以通过以下方式减少Supabase API调用:
python复制auth = get_auth(
cache=True, # 启用本地缓存
ttl=300 # 缓存5分钟
)
在应用启动时预加载Supabase客户端:
python复制@st.cache_resource
def get_supabase():
return create_client(
os.getenv("SUPABASE_URL"),
os.getenv("SUPABASE_KEY")
)
supabase = get_supabase()
常见原因及解决方案:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 登录无反应 | Supabase URL/key错误 | 检查.env文件配置 |
| 第三方登录失败 | 重定向URL未配置 | 在Supabase控制台添加正确的重定向URL |
| 会话不持久 | 浏览器阻止cookie | 检查浏览器隐私设置 |
如果遇到样式问题:
python复制with st.container():
login_form(...)
针对移动设备的优化建议:
python复制login_form(..., styles={
"input": {"font-size": "16px"}
})
典型集成模式:
python复制auth = get_auth()
if not auth:
login_form(...)
else:
show_dashboard(auth["user"])
利用Supabase的Row Level Security实现数据隔离:
python复制@st.cache_data(ttl=60)
def get_user_data(user_id):
return supabase.table("data").select("*").eq("user_id", user_id).execute()
结合用户角色控制访问权限:
python复制user_metadata = auth["user"]["user_metadata"]
if user_metadata.get("role") != "admin":
st.error("需要管理员权限")
st.stop()