Streamlit框架中默认是没有提供用户验证组件的,大家在基于streamlit快速实现web应用服务过程中,不可避免的需要配置该应用的访问范围和权限,即用户群体,一般的做法有两种,一种是通过用户密码验证机制,要求只有成功登录后的用户才可访问该应用,一种是白名单策略,比如通过系统级的防护墙进行设置,或者通过Fastapi的白名单过滤机制(即app.middleware('http'))来实现。本文主要阐述前一种,具体如下。
1.安装streamlit-authenticator组件并引入
pip3 install streamlit
pip3 install streamlit-authenticator
import streamlit as st
import streamlit_authenticator as stauth
运行环境:python3.10.4,torch1.13.1,streamlit1.26.0,streamlit-authenticator0.2.2
2.在应用中使用该组件
def mainContent():
container = st.container()
# create a prompt text for the text generation
prompt_text = st.text_area(label="用户命令输入",
height=100,
placeholder="请在这儿输入您的命令")
# 其他语句...
if __name__ == "__main__":
# 用户信息,后续可以来自DB
names = ['Oil领域用户', '管理员'] # 用户名
usernames = ['llm-oil', 'dataManagerAdmin'] # 登录名
passwords = ['S6rJam', 'Abcd1234!#!'] #登录密码
# 对密码进行加密操作,后续将这个存放在credentials中
hashed_passwords = stauth.Hasher(passwords).generate()
# 定义字典,初始化字典
credentials = {'usernames': {}}
# 生成服务器端的用户身份凭证信息
for i in range(0, len(names)):
credentials['usernames'][usernames[i]] = {'name': names[i], 'password': hashed_passwords[i]}
authenticator = stauth.Authenticate(credentials, 'some_cookie_name', 'some_signature_key', cookie_expiry_days=0)
name, authentication_status, username = authenticator.login('Login', 'main')
if authentication_status: # 登录成功
mainContent()
elif authentication_status == False: #登录失败
st.error('Username/password is incorrect')
elif authentication_status == None: #未输入登录信息
st.warning('Please enter your username and password')
3.stauth.Authenticate()接口的第一个参数格式
由于treamlit-authenticator组件的升级影响,stauth.Authenticate()接口的第一个参数类型已经调整为dict字典格式,用户身份信息存放在dict类型的credentials中,典型示例如下:
{'usernames': {'llm-oil': {'name': 'Oil领域用户', 'password': '$2b$12$LSvJNuFncmNpC3jlRva9k.ttsaHevzIvQRnvs8sJxJao/Der2fD.W'}, 'dataManagerAdmin': {'name': '管理员', 'password': '$2b$12$eHSzZXTaHcsfHDCYaYSjB.R9K35b4H7suQhHUSfu/3Zb9Q6CWAKqG'}}}
4.智能问答结果