Fix MCP permissions and repayments; restrict deletion to default admin
This commit is contained in:
1 parent
35bd2e1828
commit
794274d31b
21 files changed
+702
-52
No files matched your search
@@ -13,7 +13,7 @@ ADMIN_PASSWORD=admin
|
||||
|
||||
后台接口:`GET /api/admin/users?limit=50&offset=0`、`POST /api/admin/users`、`PATCH /api/admin/users/:id`。列表完整分页,仅返回账号身份、角色、状态和创建时间;不返回哈希、会话令牌或财务数据。角色为 `admin`、`user`、`readonly`。管理动作在事务内重查管理员权限;禁止修改自身角色或封禁自己,并保留可用管理员。
|
||||
|
||||
删除原管理员:先创建或设置另一位管理员,使用新管理员登录并完成首次改密,然后在后台原管理员所在行点击“删除管理员”。输入被删除账号名称和当前管理员密码后确认。`DELETE /api/admin/users/:id` 仅支持删除其他管理员;后端在事务中重查操作人权限、密码是否变化、被删除用户名和剩余管理员状态。至少保留另一位未封禁且完成改密的管理员,不允许删除自己。删除不可撤销,会级联清理该账号财务数据、会话和 MCP 授权,并删除私有图标;已发布共享图标保留。仍有其他管理员时,重启不会重新创建默认 admin。
|
||||
删除原管理员:先创建或设置另一位管理员,使用新管理员登录并完成首次改密,然后在后台默认 admin 所在行点击“删除默认 admin”。输入被删除账号名称和当前管理员密码后确认。`DELETE /api/admin/users/:id` 仅允许删除名为 admin 且角色为管理员的默认账号,其他账号禁止删除;后端在事务中重查操作人权限、密码是否变化、被删除用户名和剩余管理员状态。至少保留另一位未封禁且完成改密的管理员,不允许删除自己。默认账号改名后也不显示删除入口。删除不可撤销,会级联清理该账号财务数据、会话和 MCP 授权,并删除私有图标;已发布共享图标保留。仍有其他管理员时,重启不会重新创建默认 admin。
|
||||
|
||||
角色/封禁状态变化会删除该用户全部会话、撤销 MCP/PAT/OAuth 授权、取消待确认草稿和已批准待兑换授权。解封不会恢复旧令牌。密码修改也会撤销既有 MCP 授权。HTTP 与 MCP 后端都会检查封禁、首次改密和只读权限;只读用户可管理自己的登录密码及只读连接,无法提交财务写入、草稿或确认业务操作。管理员仍遵循原有财务数据用户隔离。
|
||||
|
||||
@@ -24,3 +24,5 @@ ADMIN_PASSWORD=admin
|
||||
运行隔离回归:在仓库根目录执行 `pnpm --filter @worthpath/api test:isolated`。测试库名使用随机 `wp_test_` 前缀,API 使用随机本机端口;完成或失败后清理自己创建的服务和数据库。管理员测试只在该隔离流程中运行,避免修改真实管理员。
|
||||
|
||||
历史 `005_account_icons`、`006_navigation_transfers`、`007_notes_display` 排在初始迁移之前的问题已由项目迁移入口修复,保留所有历史目录名称和 SQL 校验值。隔离测试通过正式迁移入口建立空库,再运行业务回归;不再使用 `db push` 或手动改列来代替迁移。空库失败恢复与部署命令见 [数据库迁移](database-migrations.md)。
|
||||
|
||||
2026-10-05 补充修复:删除按钮仅对默认 admin 显示,后端同时限制账号名称与管理员角色。普通用户、只读用户和非默认管理员均不能被删除,即使由管理员直接请求接口也拒绝;这些拒绝不会改变账号、会话、财务数据和授权。默认 admin 删除及保留可用管理员的保护继续通过隔离回归,详见 [更新验收](update-connections-repayment-users-2026-10-05.md)。
|
||||
+11
-1
@@ -24,7 +24,7 @@ OAuth 使用发现元数据、动态注册的公开客户端、授权码、S256
|
||||
|
||||
个人访问令牌仅作为支持自定义 Bearer 头客户端的补充。在网站验证当前密码,选择权限和 1、3、7、30 天、365 天或永久。完整值仅创建时展示,数据库只存 SHA-256 摘要。永久令牌数据库到期日为空,每个请求仍重新检查撤销和资源;为兼容 SDK 中间件,每次认证上下文有有限期验证断言,不改变令牌期限。永久令牌内部业务会话按天续期。OAuth 授权页可选择 1、3、7、30、365 天或永久,默认 30 天。访问令牌最长一小时且不超过有限授权期限;刷新时轮换摘要,不延长原授权期限。永久授权仍可撤销,内部业务会话有界并在刷新时重建。
|
||||
|
||||
旧连接有 write 时,现在直接执行普通修改;旧全局策略不再阻止它。只想创建草稿时,撤销旧连接并重新授权 read draft。历史策略行保留但不参与任何权限判断;旧敏感工具草稿不可提交。
|
||||
旧连接有 write 时,现在直接执行普通修改;旧全局策略不再阻止它。只想创建草稿时,在“我的连接”修改为 read draft,并验证当前密码。历史策略行保留但不参与任何权限判断;旧敏感工具草稿不可提交。
|
||||
|
||||
## 页面复制提示词配置
|
||||
|
||||
@@ -143,3 +143,13 @@ NETWORK_ALLOW_HTTP=true 时支持配置的 HTTP MCP 服务和网页审核地址
|
||||
### 统一网络配置
|
||||
|
||||
所有网络策略及中文说明见 apps/api/.env.example。API 与 Vite 网页开发服务共同读取 apps/api/.env,修改后重启。当前 .env 使用全网卡监听、Host/Origin 通配符、HTTP 和 HTTP 回调,Cookie 保持 HttpOnly 与 SameSite=strict。NETWORK_ALLOW_WILDCARD_ORIGINS 控制是否允许来源通配符;API_ALLOWED_HOSTS、MCP_ALLOWED_HOSTS 与 WEB_ALLOWED_HOSTS 分别控制各入口。限流开关、窗口和阈值也在环境文件中。详见 docs/network-settings.md。
|
||||
|
||||
## 修改已有连接与负债账户还款
|
||||
|
||||
2026-10-05:在“我的连接”点击“修改权限”,OAuth 与个人令牌均可选择只读、草稿或直接写入,并独立设置隐藏账户读写。保存需当前密码,只能修改本人有效且未撤销的授权;OAuth 按授权到期日判断,访问令牌到期但授权仍有效时也可修改。权限立即用于后续认证,刷新使用最新授权范围且不延长授权期限;客户端指定已被移除的 scope 时会被拒绝,需要刷新请求使用允许范围或重新授权。实际范围发生变化会取消该连接待确认草稿,不会把旧草稿自动执行。
|
||||
|
||||
网站接口为 `PATCH /api/agent/connections/:id`,请求包含 `scopes` 和 `password`;不是 MCP 工具。只读系统账号只能授予 read/hidden_read。
|
||||
|
||||
`movement_create` 的 repay 从资产账户付款,目标支持借入债务和信用卡等负债账户。账户超额还款记为溢缴存款;独立债务仍拒绝超额还款。原币本金用 amount/received,fee 为负表示优惠、为正表示手续费;保留 repay 类型,双边余额及历史在同一事务提交,记录可编辑和撤销。
|
||||
|
||||
本次通过 57 项单元测试、9 项隔离 MySQL/REST/官方 SDK 集成测试、类型检查及生产构建;网页验证权限编辑表单、还款草稿预览、默认 admin 删除入口与余额颜色。详见 [更新验收](update-connections-repayment-users-2026-10-05.md)。
|
||||
@@ -0,0 +1,40 @@
|
||||
# 连接权限、账户还款与默认 admin 删除限制
|
||||
|
||||
完成时间:2026-10-05 20:23(UTC+8)。
|
||||
|
||||
## 已授权连接
|
||||
|
||||
在“设置与备份 → 连接 Agent → 我的连接”点击“修改权限”。OAuth 和个人令牌均可选择只读、草稿或直接写入,以及隐藏账户读写;需要验证当前密码。只能修改本人有效且未撤销的连接,授权期限保持不变。只读系统账号只能授予查询权限。
|
||||
|
||||
实际权限范围变化会取消本连接未确认草稿,助手需要重新生成,不会自动执行旧草稿。相同范围再次保存不取消草稿。每次认证读取最新权限,OAuth 刷新与权限编辑锁定同一授权记录,避免并发刷新覆盖新权限。OAuth 访问令牌过期、授权期限仍有效时也可以修改权限;客户端刷新时指定已移除的 scope 会被拒绝,需要使用允许范围或重新授权。
|
||||
|
||||
网站新增 `PATCH /api/agent/connections/:id`,参数为 `scopes` 和当前 `password`;OpenAPI 同步描述请求,不新增 MCP 管理工具。
|
||||
|
||||
## 负债账户还款
|
||||
|
||||
修复 MCP `movement_create(operation=repay)` 草稿确认拒绝信用卡等负债账户的问题。付款方必须是资产账户,收款方可以是借入债务或负债账户。保留 repay 记录类型,双边余额、历史和确认结果在同一事务提交;不把账户还款改成转账,也不创建债务关联。
|
||||
|
||||
amount/received 是各自原币本金,fee 为负表示优惠、为正表示手续费。同币种本金一致。负债账户超额还款保存为溢缴存款;独立债务仍禁止超额还款。配对还款记录可修改或删除,后续余额重放保持一致;隐藏权限、归属和账目状态检查仍生效。
|
||||
|
||||
## 仅默认 admin 可删除
|
||||
|
||||
按用户澄清后的规则,只有账号名为 admin 且角色为管理员的默认账号可删除,其他管理员、普通用户和只读用户都不能删除。前端仅为非当前登录的默认 admin 显示“删除默认 admin”;后端独立拒绝其他账号的删除请求。默认账号改名后不再符合删除条件。
|
||||
|
||||
删除默认 admin 需使用另一位已完成首次改密、未封禁的管理员登录,输入 admin 并验证当前管理员密码。不能删除当前登录账号,必须保留可用管理员。默认 admin 的私人数据和授权级联删除,共享图标保留。其他用户账号、会话、财务数据和授权不受被拒绝的删除请求影响。
|
||||
|
||||
## 余额颜色
|
||||
|
||||
账户卡片、详情、账户选择器、还款弹窗、历史余额和总览统一颜色:非负余额为绿色,欠款和透支为红色。负债账户存储的溢缴款转为正数显示绿色;显示符号继续使用十进制字符串,不改动数据库金额。
|
||||
|
||||
## 验证与清理
|
||||
|
||||
- 57 项单元测试通过;HTTP 测试显式设置并恢复网络开关,避免本地 .env 政策污染测试。
|
||||
- 最终 8 项独立 MySQL/REST/官方 SDK 集成测试通过;另有正式数据库迁移回归通过。
|
||||
- 新回归覆盖权限立即生效、范围不变保留草稿、变更取消草稿、OAuth 刷新与编辑并发、授权期限不延长、过期/撤销/跨用户/只读限制及 OpenAPI。
|
||||
- 真正的账户还款草稿通过批量确认,优惠后的双方余额正确;修改、超额还款及撤销重算通过。
|
||||
- 默认 admin 删除通过;普通用户、只读用户和非默认管理员删除均返回 403,保留账号与数据。
|
||||
- 网页在独立临时库中验证权限表单、还款草稿预览、默认 admin 删除入口,以及余额绿色/欠款红色。未替用户确认真实 OAuth、草稿或删除账号。
|
||||
- 前后端类型检查与生产构建通过。数据库表和字段缺失注释均为 0;本次无需新增迁移。
|
||||
- 清理独立验收服务、测试数据库及一次性编辑/验收脚本;保留可重复运行的回归测试。截图仅保存在仓库外,不放入 docs。
|
||||
|
||||
未推送或部署。现有 compose.yaml 和 docker.md 改动保留。
|
||||
Reference in new issue
Block a user