Skip to content

fix(ORS-1008): 公告管理权限码默认给超管并修正注册时机 - #331

Merged
Rosshow merged 1 commit into
testfrom
admin-fix-announcement-permission
Oct 19, 2026
Merged

Rosshow merged 1 commit into
testfrom
admin-fix-announcement-permission

Conversation

@Zhangjlfdf

Copy link
Copy Markdown
Collaborator

问题

生产环境后台「公告管理」入口对所有账号都不可见,且系统无法自愈。活动中心(#293)上线后 announcements 表一直是 0 行。

根因

  1. 可见性没落地:后台入口判 frontend:admin:announcement:manage,但该码既不在 _GLOBAL_ROLE_DERIVED_PERMISSIONS 里、也没有 DB 权限行绑定 —— 超级管理员登录后 permissions 不含它;admin 账号直通是另一条路(生产该账号还是 inactive)。所以"设计为超管可见"这件事实际没实现。
  2. 注册时机死锁:ensure_announcement_permission() 被放在 6 个后台接口的函数体首行,而 require_permission(...) 是 FastAPI 依赖、先于函数体执行。没权限 → 403 → 永远走不到注册那行。

改动

  • permission_service.py:新增 PERM_ANNOUNCEMENT 常量,加进 _GLOBAL_ROLE_DERIVED_PERMISSIONS["超级管理员"]。超管登录即拿到该码,admin 账号照旧直通。
  • announcement.py:PERM_CODE 复用同一常量(避免两处字符串漂移),删除 6 处函数体内的 ensure_announcement_permission(),docstring 写明为什么不能在接口里注册。
  • permissions.py:把注册挪到 get_all_permissions 的注册块(与 dispatch_dev / task_policy / 知识贡献同一处),权限管理页仍可显式勾给非超管角色。
  • test_announcement_api.py:接口路径写 permissions 表改为硬失败(回归钉);补 3 条用例(超管派生、注册 code 与闸门一致、带派生码可过闸门)。

验证

  • pytest tests/test_announcement_api.py -q → 15 passed
  • 基线与改动后同批用例对照:失败集合完全一致(13 failed 均为本地环境问题,如 alembic.migration 在新版已移除),无新增回归。

上线后表现

  • 超管/管理员重新登录后(后端角色缓存 TTL 60s)即可看到「公告管理」入口,无需执行任何 DB 脚本。
  • 若要把该能力开给运营等角色:打开一次「权限管理」页,该码会自动注册进 permissions,再在角色管理里勾选即可。
  • 未改前端:AdminEntries.tsx:90 的 hasPermission(PERM_ANNOUNCEMENT) 与后端读同一个码。

权限码门禁本身是对的(与其余 frontend:admin:* 一致),问题在两点:
1) 设计上只应默认给「超级管理员」+ admin 账号,但派生表里没有这一项,
   超管登录后 permissions 不含该码,后台「公告管理」入口对谁都不可见;
2) ensure_announcement_permission() 原本放在 6 个后台接口的函数体首行,
   而 require_permission 是 FastAPI 依赖、先于函数体执行,没权限的账号
   先被 403 挡住,注册那行永远走不到(生产自锁,无法自愈)。

改动:
- permission_service 新增 PERM_ANNOUNCEMENT 常量,加入
  _GLOBAL_ROLE_DERIVED_PERMISSIONS["超级管理员"];admin 账号照旧直通。
- announcement 的 PERM_CODE 复用同一常量,删除 6 处函数体内 ensure 调用,
  并在 docstring 里写明为什么不能在接口里注册。
- permissions.get_all_permissions 注册块补 ensure_announcement_permission(),
  权限管理页仍可显式勾给非超管角色。
- 测试:接口路径写 permissions 表改为硬失败(回归钉);补超管派生、
  注册 code 与闸门一致、带派生码可过闸门 3 条用例。
@Rosshow
Rosshow merged commit 25d9051 into test Oct 19, 2026
2 of 4 checks passed
@Zhangjlfdf
Zhangjlfdf deleted the admin-fix-announcement-permission branch October 19, 2026 08:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants