diff --git a/.cospec/plan/changes/fix-admin-multi-issues/task.md b/.cospec/plan/changes/fix-admin-multi-issues/task.md index 5d05615..adfefb8 100644 --- a/.cospec/plan/changes/fix-admin-multi-issues/task.md +++ b/.cospec/plan/changes/fix-admin-multi-issues/task.md @@ -144,6 +144,17 @@ - header.php 注入到 JS 全局变量 - homework.php 快捷按钮使用配置值 + 自定义输入 + ±HOMEWORK_MAX_POINTS 限制 - attendance.php 状态按钮使用配置值 + +### 阶段 6:CORS 跨域拦截修复 + +- [x] 6.1 注册 AuthMiddleware 为全局中间件并修复 CORS 执行顺序 + 【目标对象】`backend/main.py`、`backend/middleware/auth_middleware.py` + 【修改目的】修复 CORS 跨域拦截问题:AuthMiddleware 未注册导致 request.state 属性缺失,路由层 500 错误被浏览器误报为 CORS 错误 + 【修改方式】 + - auth_middleware.py: dispatch 方法顶部添加 OPTIONS 请求跳过逻辑 + - main.py: 注册 AuthMiddleware 为全局中间件(先注册后执行),CORS 在 Auth 之后注册(后注册先执行) + - main.py: 添加 CORS 配置启动日志和空值警告 + 【中间件执行顺序】CORS → Auth → access_log → 路由 【目标对象】`frontend/admin/students.php` 【修改目的】除班主任角色外,隐藏家长手机号列的显示内容,保护隐私 【修改方式】在表头 HTML 和 JS 渲染处添加 `$role` 判断 diff --git a/.gitignore b/.gitignore index 95a28f5..f14b63f 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,4 @@ Thumbs.db *.bak # CoStrict -.costrict/ \ No newline at end of file +.cospec/ \ No newline at end of file diff --git a/backend/main.py b/backend/main.py index 5cb5024..93ba51b 100644 --- a/backend/main.py +++ b/backend/main.py @@ -32,6 +32,7 @@ async def lifespan(app: FastAPI): logger.info("正在启动应用...") await init_db_pool() await init_redis_pool() + logger.info(f"CORS 允许域名: {settings.CORS_ORIGINS}") logger.info(f"{settings.APP_NAME} 启动完成") yield @@ -59,10 +60,17 @@ async def access_log_middleware(request: Request, call_next): return response -# CORS中间件 - 从环境变量读取允许的域名 +# 认证中间件(先注册,后执行) +app.add_middleware(AuthMiddleware) + +# CORS中间件(后注册,先执行)- 从环境变量读取允许的域名 +cors_origins = settings.CORS_ORIGINS +if not cors_origins: + logger.warning("CORS_ORIGINS 未配置或为空,跨域请求将被拒绝!请检查 .env 文件中的 CORS_ORIGINS 配置") + app.add_middleware( CORSMiddleware, - allow_origins=settings.CORS_ORIGINS, + allow_origins=cors_origins, allow_credentials=True, allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"], allow_headers=["*"], diff --git a/backend/middleware/auth_middleware.py b/backend/middleware/auth_middleware.py index 639eb44..07bf971 100644 --- a/backend/middleware/auth_middleware.py +++ b/backend/middleware/auth_middleware.py @@ -49,6 +49,10 @@ class AuthMiddleware(BaseHTTPMiddleware): """JWT认证中间件""" async def dispatch(self, request: Request, call_next): + # OPTIONS 预检请求跳过认证 + if request.method == "OPTIONS": + return await call_next(request) + path = request.url.path # 公开路径跳过认证