fix:[FL-220][菜单禁用访问控制]
Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
@@ -18,6 +18,34 @@
|
||||
- 风险与关注点:
|
||||
- 改动仅影响菜单管理页前端展示与提示机制,不改变菜单接口、字段结构或权限语义。
|
||||
|
||||
# Work Log - 菜单禁用访问控制修复(FL-220)
|
||||
|
||||
- 背景:
|
||||
- 菜单状态设为 disabled 后,侧边栏依赖 WebSocket 推送刷新,推送丢失时可能继续显示;直接访问对应页面/API 时也缺少菜单状态防护。
|
||||
|
||||
- 本次处理:
|
||||
- 后台 layout 的 `/api/v1/admin/me/menus` 改为 React Query 共享查询,并在 `admin.menus` / `auth` 推送后统一失效刷新。
|
||||
- 菜单管理页创建、编辑、删除、启用/禁用成功后显式失效 `/api/v1/admin/me/menus`,确保侧边栏立即同步。
|
||||
- 后台 layout 增加基于启用菜单树的路由 403 防护,当前路径不在可见菜单树时不再渲染页面内容。
|
||||
- 后端新增菜单路由守卫,将菜单对应 API 前缀映射到菜单 path;命中 disabled/hidden 菜单时直接返回 403。
|
||||
- 现代菜单树过滤改为 admin 与普通角色都排除 disabled/hidden 菜单。
|
||||
- 新增 `api/tests/test_menu_route_guard.py` 覆盖禁用菜单隐藏、API 403、启用菜单继续放行、隐藏菜单 403。
|
||||
|
||||
- 验证:
|
||||
- 基线:`npm --workspace web exec eslint src/app/admin/layout.tsx src/app/admin/menus/page.tsx --max-warnings=0` 通过但存在既有 layout `<img>` 与 unused callback warning。
|
||||
- 基线:`npm --workspace web exec tsc --noEmit --pretty false` 通过。
|
||||
- 基线:`python3 -m unittest api.tests.test_seed_defaults_contract api.tests.test_role_pagination_contract` 因本地解释器缺少 SQLAlchemy / PYTHONPATH 不满足失败。
|
||||
- 修改后:`python3 -m py_compile ...` 覆盖本次改动后端文件与新增测试,通过。
|
||||
- 修改后:`UV_CACHE_DIR=/tmp/fquiz-uv-cache UV_PYTHON_INSTALL_DIR=/tmp/fquiz-uv-python /home/ck/.local/bin/uv run --python 3.11 --with pytest --with fastapi --with pydantic-settings --with sqlalchemy --with PyJWT --with argon2-cffi --with email-validator --with python-multipart --with psycopg[binary] --with bcrypt --with 'celery[redis]' pytest api/tests/test_menu_route_guard.py` 通过,4 passed,存在既有 SQLAlchemy relationship warning。
|
||||
- 修改后:`npm --workspace web exec tsc --noEmit --pretty false` 通过。
|
||||
- 修改后:`npm --workspace web exec eslint src/app/admin/layout.tsx src/app/admin/menus/page.tsx --max-warnings=0` 仍仅有既有 layout `<img>` warning。
|
||||
- 修改后:`git diff --check` 通过。
|
||||
- 修改后:`graphify update .` 通过并更新 `graphify-out`。
|
||||
|
||||
- 风险与关注点:
|
||||
- 后端菜单路由守卫以明确 API 前缀映射菜单 path;新增菜单页若后续引入独立 API,需要同步补充映射。
|
||||
- 菜单管理 API 本身未加禁用守卫,保留为恢复入口,避免禁用菜单管理后无法重新启用。
|
||||
|
||||
## Follow-up - 菜单管理页 React Query 架构对齐(FL-151)
|
||||
|
||||
- 背景:
|
||||
|
||||
Reference in New Issue
Block a user