Gradio身份认证集成:DAMO-YOLO手机检测WebUI添加Basic Auth访问控制教程

📅 发布时间:2026/7/8 12:52:05 👁️ 浏览次数:
Gradio身份认证集成:DAMO-YOLO手机检测WebUI添加Basic Auth访问控制教程
Gradio身份认证集成DAMO-YOLO手机检测WebUI添加Basic Auth访问控制教程1. 引言1.1 学习目标本教程将手把手教你如何为基于DAMO-YOLO的手机检测WebUI系统添加Basic Auth基础身份认证功能。学完本文后你将能够理解Basic Auth认证的基本原理在Gradio应用中快速集成身份验证保护你的AI应用免受未授权访问管理多用户账号和权限1.2 为什么需要身份认证手机检测系统可能处理敏感图像数据比如考场监控、会议记录等场景。添加身份认证可以保护隐私防止未授权用户访问系统控制访问只允许特定人员使用服务记录日志追踪谁在什么时候使用了系统符合规范满足数据安全的基本要求1.3 前置知识本教程适合有一定Python基础的开发者不需要深厚的安全知识背景。我们会用最简单的方式实现认证功能。2. 环境准备与快速部署2.1 检查现有系统首先确认你的手机检测系统正常运行# 检查服务状态 supervisorctl status phone-detection # 测试WebUI访问 curl -I http://localhost:7860如果返回HTTP 200状态码说明系统正常。2.2 安装所需依赖为现有项目添加认证所需的依赖包# 进入项目目录 cd /root/phone-detection # 安装密码加密库 pip install bcrypt passlib # 或者使用requirements.txt追加 echo bcrypt4.0.0 requirements.txt echo passlib1.7.4 requirements.txt3. Basic Auth基础概念快速入门3.1 什么是Basic AuthBasic Auth是一种简单的HTTP身份认证方式工作原理如下客户端访问用户打开网页服务器询问浏览器弹出登录框用户输入输入用户名和密码编码传输密码经过Base64编码发送服务器验证检查凭证是否正确授权访问验证通过后显示内容3.2 安全性说明Basic Auth有以下特点简单易用容易实现和理解广泛支持所有浏览器都支持基础加密密码仅Base64编码建议配合HTTPS使用每次请求验证浏览器会缓存凭证避免重复输入对于内部系统或低安全需求场景Basic Auth是完全足够的解决方案。4. 分步实践操作4.1 创建认证工具函数在项目根目录创建auth_utils.py文件import base64 from passlib.context import CryptContext # 创建密码加密上下文 pwd_context CryptContext(schemes[bcrypt], deprecatedauto) def verify_password(plain_password, hashed_password): 验证密码是否正确 return pwd_context.verify(plain_password, hashed_password) def get_password_hash(password): 生成密码哈希值 return pwd_context.hash(password) def decode_basic_auth(auth_header): 解码Basic Auth头信息 if not auth_header or not auth_header.startswith(Basic ): return None try: encoded_credentials auth_header.split( )[1] decoded_credentials base64.b64decode(encoded_credentials).decode(utf-8) username, password decoded_credentials.split(:, 1) return username, password except: return None4.2 创建用户配置文件创建config/users.py文件管理用户信息# 预定义用户列表用户名: 加密后的密码 # 密码使用 bcrypt 加密安全性更高 USER_CREDENTIALS { admin: $2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPVgaYl5O, # 密码: admin123 user: $2b$12$Gp9WlZRkL3q2P1VjXp5nE.1q2w3e4r5t6y7u8i9o0p, # 密码: user456 guest: $2b$12$Hq9XmZSkM4r5t6y7u8i9o0.1q2w3e4r5t6y7u8i9o0p # 密码: guest789 } def authenticate_user(username: str, password: str): 验证用户身份 if username not in USER_CREDENTIALS: return False hashed_password USER_CREDENTIALS[username] return verify_password(password, hashed_password)4.3 修改主应用文件更新app.py文件添加认证中间件import gradio as gr from fastapi import FastAPI, Request, HTTPException, Depends from fastapi.security import HTTPBasic, HTTPBasicCredentials from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles from auth_utils import decode_basic_auth, verify_password from config.users import USER_CREDENTIALS import os # 创建FastAPI应用 app FastAPI(title手机检测系统) # 添加Basic认证 security HTTPBasic() def basic_auth(request: Request): Basic认证验证函数 auth_header request.headers.get(Authorization) if not auth_header: raise HTTPException( status_code401, detail需要身份认证, headers{WWW-Authenticate: Basic realm\手机检测系统\} ) credentials decode_basic_auth(auth_header) if not credentials: raise HTTPException( status_code401, detail认证信息格式错误, headers{WWW-Authenticate: Basic realm\手机检测系统\} ) username, password credentials if username not in USER_CREDENTIALS: raise HTTPException( status_code401, detail用户名或密码错误, headers{WWW-Authenticate: Basic realm\手机检测系统\} ) if not verify_password(password, USER_CREDENTIALS[username]): raise HTTPException( status_code401, detail用户名或密码错误, headers{WWW-Authenticate: Basic realm\手机检测系统\} ) return username # 创建Gradio应用 with gr.Blocks(title手机检测系统, themegr.themes.Soft()) as demo: # ... 原有的界面代码保持不变 ... gr.Markdown(# 实时手机检测系统) # 其他界面组件... # 将Gradio应用挂载到FastAPI app gr.mount_gradio_app(app, demo, path/) # 添加认证中间件 app.middleware(http) async def add_auth_middleware(request: Request, call_next): # 排除静态文件等不需要认证的路径 if request.url.path in [/, /config] or request.url.path.startswith((/static/, /file)): return await call_next(request) # 进行认证 try: username basic_auth(request) response await call_next(request) return response except HTTPException as e: return e4.4 创建密码生成工具创建create_user.py工具来生成新用户from auth_utils import get_password_hash import getpass def create_new_user(): 交互式创建新用户 username input(请输入用户名: ).strip() password getpass.getpass(请输入密码: ) confirm_password getpass.getpass(请确认密码: ) if password ! confirm_password: print(密码不匹配) return hashed_password get_password_hash(password) print(f\n用户创建成功) print(f用户名: {username}) print(f加密密码: {hashed_password}) # 添加到用户配置 print(f\n请将以下内容添加到 config/users.py 的 USER_CREDENTIALS 中:) print(f {username}: {hashed_password}) if __name__ __main__: create_new_user()5. 快速上手示例5.1 一键部署认证功能如果你想要快速为现有系统添加认证可以使用这个简化版本# 在app.py顶部添加 from fastapi import HTTPException from fastapi.security import HTTPBasicCredentials, HTTPBasic security HTTPBasic() def check_auth(credentials: HTTPBasicCredentials Depends(security)): 简单的认证检查 if credentials.username ! admin or credentials.password ! admin123: raise HTTPException( status_code401, detail认证失败, headers{WWW-Authenticate: Basic} ) return credentials.username # 在Gradio应用前添加 app.get(/) async def read_root(username: str Depends(check_auth)): return {message: f欢迎, {username}!}5.2 测试认证功能部署完成后测试认证是否正常工作# 重启服务 supervisorctl restart phone-detection # 测试未认证访问应该返回401 curl -I http://localhost:7860 # 测试认证访问 curl -u admin:admin123 http://localhost:7860在浏览器中访问 http://你的服务器IP:7860 现在应该会弹出登录框输入正确的用户名和密码后就能正常使用手机检测功能了。6. 实用技巧与进阶6.1 多用户权限管理如果你需要更精细的权限控制可以扩展用户配置# 在config/users.py中扩展 USER_PERMISSIONS { admin: { password_hash: $2b$12$EixZaYVK1fsbw1ZfbX3OXe..., permissions: [view, upload, delete, manage_users] }, user: { password_hash: $2b$12$Gp9WlZRkL3q2P1VjXp5nE..., permissions: [view, upload] }, guest: { password_hash: $2b$12$Hq9XmZSkM4r5t6y7u8i9o0..., permissions: [view] } }6.2 增强安全性建议采取以下安全措施使用HTTPS防止密码被窃听强密码策略要求复杂密码定期更换密码建议每90天更换一次失败尝试限制防止暴力破解日志记录记录登录尝试和访问行为6.3 故障排除如果认证功能出现问题检查以下方面# 查看错误日志 tail -f /root/phone-detection/logs/error.log # 测试认证接口 curl -u test:test http://localhost:7860 # 应该返回401 curl -u admin:admin123 http://localhost:7860 # 应该返回200 # 检查依赖包 pip list | grep -E (bcrypt|passlib)7. 常见问题解答7.1 认证后页面显示不全怎么办这可能是因为静态文件也被要求认证。修改中间件逻辑排除静态文件路径# 在认证中间件中添加排除路径 excluded_paths [/, /static/, /file, /favicon.ico] app.middleware(http) async def add_auth_middleware(request: Request, call_next): # 检查是否在排除列表中 if any(request.url.path.startswith(path) for path in excluded_paths): return await call_next(request) # 进行认证...7.2 如何修改或重置密码使用密码生成工具创建新密码哈希然后更新用户配置# 运行密码生成工具 python create_user.py # 输入新用户名和密码 # 更新config/users.py中的对应条目7.3 认证弹出框不出现怎么办检查浏览器是否缓存了错误的凭证。可以尝试清除浏览器缓存和Cookie使用隐私/无痕模式访问或者手动触发认证在URL前添加用户名:密码如http://admin:admin123localhost:78607.4 如何添加更多用户使用提供的create_user.py工具生成新用户的加密密码然后添加到USER_CREDENTIALS字典中。8. 总结通过本教程你已经成功为DAMO-YOLO手机检测WebUI系统添加了Basic Auth身份认证功能。现在你的系统需要登录才能访问保护了系统安全支持多用户管理可以添加不同用户账号保持了原有功能认证对用户体验影响最小易于维护扩展代码结构清晰易懂8.1 下一步建议启用HTTPS为你的WebUI添加SSL证书确保密码传输安全设置防火墙限制只有特定IP可以访问7860端口定期审计检查日志文件监控异常访问尝试备份配置定期备份用户配置和密码文件8.2 扩展阅读如果你想进一步强化系统安全可以考虑OAuth2集成使用第三方认证服务双因素认证增加短信或邮箱验证访问频率限制防止暴力破解攻击审计日志详细记录所有访问行为获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。