Streamlit 实现登录注册验证

embedded/2024/10/18 18:52:06/

在开发基于 Streamlit 的应用时,用户认证功能是一个常见需求。本文将介绍如何通过两种方式来实现登录注册功能:手动实现使用 Streamlit-Authenticator 库。手动实现虽然灵活,但需要自行处理密码加密、验证等细节;而 Streamlit-Authenticator 库则大大简化了这些操作,让我们能够快速搭建一个完整的用户认证系统。

一、手动实现登录注册

我们首先通过手动方式实现登录和注册功能。这种方式适用于你需要对认证流程有更多控制的场景。

1. 环境准备

在开始之前,需要确保安装了 streamlitbcrypt 库,用于处理用户界面和密码加密。

pip install streamlit bcrypt

2. 注册功能

在注册功能中,用户输入用户名和密码。密码将通过 bcrypt 进行加密存储,以提高安全性。

python">import streamlit as st
import bcrypt# 模拟的用户数据库
users_db = {}# 注册页面
def register():st.title("用户注册")# 输入用户名和密码new_user = st.text_input("请输入用户名")new_password = st.text_input("请输入密码", type="password")if st.button("注册"):if new_user in users_db:st.warning("用户名已存在,请选择其他用户名")else:# 对密码进行加密hashed_password = bcrypt.hashpw(new_password.encode('utf-8'), bcrypt.gensalt())users_db[new_user] = hashed_passwordst.success("注册成功!")st.info("请返回登录页面")if __name__ == '__main__':register()

在这个示例中,用户的密码会被 bcrypt 加密后存储,保证其安全性。每次用户注册时,都会生成一个新的加密密码,并存入 users_db

3. 登录功能

接下来是登录功能。用户输入用户名和密码后,系统会验证其输入的密码是否与存储的加密密码匹配。

python"># 登录页面
def login():st.title("用户登录")# 输入用户名和密码username = st.text_input("请输入用户名")password = st.text_input("请输入密码", type="password")if st.button("登录"):if username in users_db:# 验证密码是否匹配hashed_password = users_db[username]if bcrypt.checkpw(password.encode('utf-8'), hashed_password):st.success(f"欢迎回来,{username}!")st.info("你已成功登录")main_page()else:st.error("密码错误,请重试")else:st.warning("用户名不存在")# 登录成功后的主页面
def main_page():st.title("主页面")st.write("这是登录后的主页面内容")if __name__ == '__main__':login()

这里通过 bcrypt.checkpw() 函数验证用户输入的密码是否与数据库中的加密密码匹配。如果密码验证成功,用户会进入主页面。

4. 页面导航

为了方便用户在登录注册页面之间切换,可以通过以下代码实现简单的页面导航功能。

python">def main():st.sidebar.title("导航")choice = st.sidebar.radio("选择页面", ["登录", "注册"])if choice == "登录":login()elif choice == "注册":register()if __name__ == '__main__':main()

这个页面导航让用户可以在侧边栏自由切换登录和注册功能,从而提升用户体验。

5. 小结

通过以上代码,我们实现了一个基本的用户登录注册系统,包括:

  • 注册功能:加密存储用户密码,防止明文密码泄露。
  • 登录功能:验证用户输入的密码是否与存储的加密密码匹配。
  • 页面导航:让用户可以在不同功能页面间切换。

这种手动实现方式适合需要灵活控制认证流程的场景,但当项目规模较大或需求更加复杂时,这种方式可能会显得繁琐。接下来,我们介绍如何使用 Streamlit-Authenticator 库来简化这一过程。


二、使用 Streamlit-Authenticator 实现登录注册

Streamlit-Authenticator 是一个专门用于 Streamlit 应用的用户认证库,它能够帮助我们快速构建基于哈希加密JWT令牌的认证系统。使用该库,我们可以省去手动实现登录、注册、加密等繁琐的过程。

1. 安装 Streamlit-Authenticator

首先,安装 streamlit-authenticator 库:

pip install streamlit-authenticator

2. 使用 Streamlit-Authenticator 实现认证

以下是使用 streamlit-authenticator 库实现用户登录的代码示例:

python">import streamlit as st
import streamlit_authenticator as stauth
import yaml
from yaml.loader import SafeLoader# 加载用户数据
config = {'credentials': {'usernames': {'user1': {'name': 'User One','password': stauth.Hasher(['password1']).generate()[0]},'user2': {'name': 'User Two','password': stauth.Hasher(['password2']).generate()[0]}}},'cookie': {'expiry_days': 30,'key': 'some_signature_key'},'preauthorized': {'emails': ['user1@example.com','user2@example.com']}
}# 创建 Authenticator 对象
authenticator = stauth.Authenticate(config['credentials'],config['cookie']['key'],config['cookie']['expiry_days'],
)# 登录功能
name, authentication_status, username = authenticator.login('登录', 'main')if authentication_status:st.success(f'欢迎回来, {name}!')# 退出登录按钮authenticator.logout('退出', 'sidebar')st.write("这里是登录后显示的内容")
elif authentication_status == False:st.error('用户名或密码错误')
elif authentication_status == None:st.warning('请输入用户名和密码')

3. 代码解析

  1. 用户数据配置config 字典模拟用户数据库stauth.Hasher 用于生成加密密码。
  2. 登录功能authenticator.login() 用于处理登录验证,根据返回值 authentication_status 判断用户登录状态。
  3. Cookie:配置项中的 cookie 设置了 JWT 的有效期,并使用一个密钥来确保用户登录状态的持久性。
  4. 登出功能:用户成功登录后可以通过侧边栏中的按钮退出登录。

通过 Streamlit-Authenticator,我们大大简化了用户登录、认证和密码加密的过程。

4. 小结

Streamlit-Authenticator 提供了开箱即用的用户认证功能,尤其适用于需要快速搭建用户管理系统的场景。相比手动实现,它的优点包括:

  • 内置的密码加密机制。
  • 支持长时间登录的 JWT 机制。
  • 更加安全、便捷的用户认证体验。

三、总结

本文展示了两种实现 Streamlit 用户认证的方式:

  1. 手动实现:我们通过 bcrypt 加密用户密码,自己实现了登录、注册和认证的基本功能。这种方式适合需要灵活处理认证逻辑的场景。
  2. 使用 Streamlit-Authenticator:该库简化了整个认证流程,提供了更安全和方便的解决方案,适合需要快速构建用户系统的场景。

根据你的需求,可以选择适合的实现方式。对于更复杂或更大规模的应用,Streamlit-Authenticator 无疑是更好的选择。


http://www.ppmy.cn/embedded/123675.html

相关文章

iTextPDF中,要实现表格中的内容在数据长度超过边框时自动换行

在iTextPDF中,要实现表格中的内容在数据长度超过边框时自动换行,你可以使用Phrase对象并设置其HyphenationEvent,或者使用Chunk对象并设置其setSplitCharacter方法。以下是一些方法来实现这一功能: 1. 使用Phrase对象&#xff1a…

贴吧软件怎么切换ip

在网络使用中,有时我们需要切换IP地址来满足特定的需求,比如需要切换贴吧软件IP以进行不同的操作。本文将介绍几种贴吧切换IP地址的方法,帮助用户更好地管理自己的网络身份和访问权限。 1、更换网络环境‌ 通过连接到不同的Wi-Fi网络或使用移…

数据结构(7.4_1)——B树

B树的定义 m阶B树的核心特性: B树的高度 最小高度 最大高度 总结:

高点摄像山火烟雾检测数据集 共2890张图像,分辨率1920×1080,标注采用json格式,标注了每个烟雾的位置,烟雾浓度等级(低,中,高),共1.1GB

高点摄像山火烟雾检测数据集(并按照低、中详细标注烟雾浓度)。主要针对初期山火,任何野火检测系统的最重要目标是在火势扩大之前及时检测到火灾。在初期阶段,野火由非火焰性的燃烧烟雾组成,热量相对较低。在这个阶段识…

(11)MATLAB莱斯(Rician)衰落信道仿真2

文章目录 前言一、莱斯衰落信道仿真模型二、仿真代码与结果1.仿真代码2.仿真结果画图 三、后续:四、参考文献: 前言 首先给出莱斯衰落信道仿真模型,该模型由直射路径分量和反射路径分量组成,其中反射路径分量由瑞利衰落信道模型构…

pnpm依赖安装失败解决|pnpm项目从一个文件夹复制到另一个文件夹运行失败问题解决-以vbenAdmin项目为例

1 前言 最近在使用vben admin项目迁移时,从一个文件夹复制到另一个文件夹运行不起来,排查了一天,终于把问题排查出来了,特地记录一下,便于自己看也便于大家看。 使用项目安装包版本: v2.11.5 https://gi…

Ray_Tracing_The_Next_Week下

5image Texture Mapping 图像纹理映射 我们之前虽然在交点信息新增了uv属性,但其实并没有使用,而是通过p交点笛卡尔坐标确定瓷砖纹理或者大理石噪声纹理的值 现在通过uv坐标读取图片,通过std_image库stbi_load(path)…

Redis实现每日签到(大数据量)

PHP语言使用Redis NoSQL服务器二进制数据类型实现大数据情况下签到功能 目录 问题 解决方式 封装签到类 功能调用 总结 问题 实现用户每日签到功能不难,但随着用户量上升之后,不论是存储还是判断对数据量来说都很麻烦;假如每天有100万用…