feat(security): P0 安全止血 - WS token 改 header + 坐席本地密码
【workbuddy 推送 2026-06-14,任务 #10】 修复: - P0-#4 WS token 泄露:服务端 ws.py 优先从 Authorization: Bearer header 取, query param 仅作向后兼容降级路径(h5_websocket_endpoint 同) - P0-#5 坐席本地密码:Agent 模型加 password_hash 字段(bcrypt), 坐席登录增加 password 字段(企微验证失败时备用), 新增 POST /agents/password 端点修改密码, alembic 008 迁移脚本 新增/变更: M backend/app/api/agents.py (+67 行,登录 password 验证 + 改密端点) M backend/app/api/ws.py (~+30 行,header 优先 + query 降级) M backend/app/models/agent.py (+10 行,password_hash 字段) M backend/app/schemas/agent.py (+7 行,password 字段) M frontend-agent/.../useWebSocket.ts (+5 行,Authorization header) A backend/alembic/versions/008_add_agent_password.py A docs/安全/secret-管理.md (P0-#1 长期方案规划) 【评审遗留 5 项,详见 docs/评审报告/workbuddy-2026-06-14-P0安全.md】 - [P0-#4-ws.ts] 浏览器 WebSocket API 不支持自定义 header,需改 Sec-WebSocket-Protocol - [P0-#4-nginx] nginx access_log 没关闭,token 仍可能经 access_log 泄露 - [P0-#5-type] model Mapped[str] 严格模式下为 None 会报错,应改 Optional - [P0-#5-fall] 企微降级放行路径不强制 password 验证,反削弱 P0-#5 - [P0-#5-dep] requirements.txt 缺 passlib 依赖,部署会 ImportError 【推 Gitea】 卡 #8: MariaDB 套件未装,Gitea 未启动。本次 commit 暂存本地, Gitea 起来后一次 git push -u origin main 推送供 workbuddy 二次评审。
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
"""add agent password_hash
|
||||
|
||||
Revision ID: 008_add_agent_password
|
||||
Revises: 007_role_system
|
||||
Create Date: 2026-06-14
|
||||
|
||||
P0-#5: 添加坐席本地密码哈希字段
|
||||
- 新增 password_hash 字段(可选,用于本地密码认证)
|
||||
- 使用 bcrypt 加密存储
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
# revision identifiers
|
||||
revision = '008_add_agent_password'
|
||||
down_revision = '007_role_system'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
"""添加 password_hash 字段"""
|
||||
op.add_column(
|
||||
'agents',
|
||||
sa.Column(
|
||||
'password_hash',
|
||||
sa.String(128),
|
||||
nullable=True,
|
||||
comment='本地密码哈希(bcrypt)'
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
"""删除 password_hash 字段"""
|
||||
op.drop_column('agents', 'password_hash')
|
||||
Reference in New Issue
Block a user