news 2026/4/21 8:45:44

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 "bcrypt>=4.0.0" >> requirements.txt echo "passlib>=1.7.4" >> requirements.txt

3. Basic Auth基础概念快速入门

3.1 什么是Basic Auth?

Basic Auth是一种简单的HTTP身份认证方式,工作原理如下:

  1. 客户端访问:用户打开网页
  2. 服务器询问:浏览器弹出登录框
  3. 用户输入:输入用户名和密码
  4. 编码传输:密码经过Base64编码发送
  5. 服务器验证:检查凭证是否正确
  6. 授权访问:验证通过后显示内容

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"], deprecated="auto") 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 None

4.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_code=401, detail="需要身份认证", headers={"WWW-Authenticate": "Basic realm=\"手机检测系统\""} ) credentials = decode_basic_auth(auth_header) if not credentials: raise HTTPException( status_code=401, detail="认证信息格式错误", headers={"WWW-Authenticate": "Basic realm=\"手机检测系统\""} ) username, password = credentials if username not in USER_CREDENTIALS: raise HTTPException( status_code=401, detail="用户名或密码错误", headers={"WWW-Authenticate": "Basic realm=\"手机检测系统\""} ) if not verify_password(password, USER_CREDENTIALS[username]): raise HTTPException( status_code=401, detail="用户名或密码错误", headers={"WWW-Authenticate": "Basic realm=\"手机检测系统\""} ) return username # 创建Gradio应用 with gr.Blocks(title="手机检测系统", theme=gr.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 e

4.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_code=401, 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 增强安全性

建议采取以下安全措施:

  1. 使用HTTPS:防止密码被窃听
  2. 强密码策略:要求复杂密码
  3. 定期更换密码:建议每90天更换一次
  4. 失败尝试限制:防止暴力破解
  5. 日志记录:记录登录尝试和访问行为

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 认证弹出框不出现怎么办?

检查浏览器是否缓存了错误的凭证。可以尝试:

  1. 清除浏览器缓存和Cookie
  2. 使用隐私/无痕模式访问
  3. 或者手动触发认证:在URL前添加用户名:密码@,如http://admin:admin123@localhost:7860

7.4 如何添加更多用户?

使用提供的create_user.py工具生成新用户的加密密码,然后添加到USER_CREDENTIALS字典中。

8. 总结

通过本教程,你已经成功为DAMO-YOLO手机检测WebUI系统添加了Basic Auth身份认证功能。现在你的系统:

  • 需要登录才能访问,保护了系统安全
  • 支持多用户管理,可以添加不同用户账号
  • 保持了原有功能,认证对用户体验影响最小
  • 易于维护扩展,代码结构清晰易懂

8.1 下一步建议

  1. 启用HTTPS:为你的WebUI添加SSL证书,确保密码传输安全
  2. 设置防火墙:限制只有特定IP可以访问7860端口
  3. 定期审计:检查日志文件,监控异常访问尝试
  4. 备份配置:定期备份用户配置和密码文件

8.2 扩展阅读

如果你想进一步强化系统安全,可以考虑:

  • OAuth2集成:使用第三方认证服务
  • 双因素认证:增加短信或邮箱验证
  • 访问频率限制:防止暴力破解攻击
  • 审计日志:详细记录所有访问行为

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 22:25:58

ccmusic-database/music_genre:音乐分类的终极解决方案

ccmusic-database/music_genre:音乐分类的终极解决方案 你有没有遇到过这样的情况:听到一首歌,旋律很熟悉,节奏很带感,但就是说不上来它属于什么流派?或者在整理个人音乐库时,面对上千首未标注…

作者头像 李华
网站建设 2026/4/18 16:41:48

【Django毕设全套源码+文档】基于django的智能医疗辅助系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/16 22:43:34

MTools极简教程:零配置开启高效文本处理

MTools极简教程:零配置开启高效文本处理 1. 为什么你需要MTools——告别繁琐配置的文本处理新方式 你是否经历过这样的场景:需要快速总结一份会议纪要,却要打开多个网页、粘贴文本、等待加载、反复调整参数;想提取一份技术文档的…

作者头像 李华
网站建设 2026/4/17 23:57:31

【Django毕设全套源码+文档】基于django的智能健康检测系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/18 9:16:49

3步搞定Qwen3-Reranker-0.6B部署:检索增强生成利器

3步搞定Qwen3-Reranker-0.6B部署:检索增强生成利器 1. 教程目标与适用人群 1.1 学习目标 本教程专为想要快速上手Qwen3-Reranker-0.6B模型的开发者设计,通过三个简单步骤,你将能够: 理解重排序模型在RAG系统中的核心价值在本地…

作者头像 李华
网站建设 2026/4/20 22:49:38

阿里Qwen黑科技:12Hz采样率的高保真音频编解码

阿里Qwen黑科技:12Hz采样率的高保真音频编解码 你有没有想过,一段30秒的语音,原本需要几MB的WAV文件来存储,现在只需几百个数字就能完整表达?更神奇的是,用这几百个数字重建出来的声音,听起来几…

作者头像 李华