security(auth): 新增 member/provider 角色 middleware #71

Merged
a620906209 merged 2 commits from security/implement-role-middleware into master 2026-10-17 16:12:03 +00:00
Owner

摘要

實作 OpenSpec change add-role-middleware,補上待辦 H1:/api/member/*、/api/provider/* 原本只有 auth:sanctum,任何已登入帳號都能跨角色建立課程、預約與評價。

  • 新增 EnsureMember、EnsureProvider(結構同 EnsureAdmin),註冊 alias member、provider 並掛到對應路由群組
  • 角色不符回 403 { status: false, message: "無權限存取" };未登入仍由 auth:sanctum 回 401;register/login 不受影響
  • provider middleware 不檢查審核狀態,未通過審核的教練仍可送審
  • 跨角色共用路由(通知、即時訊息、/reviews/{id}/helpful、/logout、/user)維持原狀
  • Swagger:member/provider 端點的 403 描述補上「角色不符」,補齊 4 個列表端點的 403

Commits

  • 16ccb4c security(auth):功能、測試、Swagger、tasks(審查安全變更請看這個 commit)
  • 90fc8f2 style:pint 格式化 routes/api.php、app/Docs/*、BookingListTest.php(既有格式問題,純格式;已驗證 route:list 與 l5-swagger 產出不變)

測試

  • 新增 RoleAuthorizationTest(13 tests):member/provider/admin/未登入跨角色測試,並驗證越權請求不寫入資料
  • 已確認拒絕類測試在移除 middleware 後會失敗
  • 完整 php artisan test(含 GD 的容器):252 passed,0 skipped
  • pint:8 個變更的 PHP 檔皆通過;openspec validate --specs 通過

審查

  • Claude Code strict-reviewer:PASS
  • Pi 交叉審查:OK(GD 缺失的 B-001 已在含 GD 環境驗證通過)

尚未完成

  • 5.1 手動:本機 Docker 以 member token 呼叫 POST /api/provider/offers、provider token 呼叫 POST /api/member/bookings,確認皆 403
  • 5.2 手動:前端會員端「我的預約」、教練端課程/時段/預約/審核頁正常,無 403

部署

無 migration、無新套件、無環境變數;合併後由 deploy 的 route:cache 生效。回滾:revert 後重新部署。

後續

合併後另開 PR 執行歸檔(/opsx:archive),並同步更新 CLAUDE.md 授權規範與 openspec/config.yaml 中「member/provider 只有 auth:sanctum」的過時描述。

🤖 Generated with Claude Code

## 摘要 實作 OpenSpec change `add-role-middleware`,補上待辦 H1:`/api/member/*`、`/api/provider/*` 原本只有 `auth:sanctum`,任何已登入帳號都能跨角色建立課程、預約與評價。 - 新增 `EnsureMember`、`EnsureProvider`(結構同 `EnsureAdmin`),註冊 alias `member`、`provider` 並掛到對應路由群組 - 角色不符回 `403 { status: false, message: "無權限存取" }`;未登入仍由 `auth:sanctum` 回 401;register/login 不受影響 - provider middleware **不檢查審核狀態**,未通過審核的教練仍可送審 - 跨角色共用路由(通知、即時訊息、`/reviews/{id}/helpful`、`/logout`、`/user`)維持原狀 - Swagger:member/provider 端點的 403 描述補上「角色不符」,補齊 4 個列表端點的 403 ## Commits - `16ccb4c` security(auth):功能、測試、Swagger、tasks(**審查安全變更請看這個 commit**) - `90fc8f2` style:pint 格式化 `routes/api.php`、`app/Docs/*`、`BookingListTest.php`(既有格式問題,純格式;已驗證 route:list 與 l5-swagger 產出不變) ## 測試 - 新增 `RoleAuthorizationTest`(13 tests):member/provider/admin/未登入跨角色測試,並驗證越權請求不寫入資料 - 已確認拒絕類測試在移除 middleware 後會失敗 - 完整 `php artisan test`(含 GD 的容器):**252 passed,0 skipped** - pint:8 個變更的 PHP 檔皆通過;`openspec validate --specs` 通過 ## 審查 - Claude Code `strict-reviewer`:PASS - Pi 交叉審查:OK(GD 缺失的 B-001 已在含 GD 環境驗證通過) ## 尚未完成 - [ ] 5.1 手動:本機 Docker 以 member token 呼叫 `POST /api/provider/offers`、provider token 呼叫 `POST /api/member/bookings`,確認皆 403 - [ ] 5.2 手動:前端會員端「我的預約」、教練端課程/時段/預約/審核頁正常,無 403 ## 部署 無 migration、無新套件、無環境變數;合併後由 deploy 的 `route:cache` 生效。回滾:revert 後重新部署。 ## 後續 合併後另開 PR 執行歸檔(`/opsx:archive`),並同步更新 `CLAUDE.md` 授權規範與 `openspec/config.yaml` 中「member/provider 只有 auth:sanctum」的過時描述。 🤖 Generated with [Claude Code](https://claude.com/claude-code)
a620906209 added 2 commits 2026-10-17 16:05:49 +00:00
補上待辦 H1:/api/member/*、/api/provider/* 原本只掛 auth:sanctum,
任何已登入帳號都能跨角色建立課程、預約與評價。

- 新增 EnsureMember、EnsureProvider(結構同 EnsureAdmin),註冊 alias
  member、provider,掛到對應路由群組;角色不符回 403
  { status: false, message: "無權限存取" },未登入仍由 auth:sanctum 回 401
- provider middleware 不檢查審核狀態,未通過審核的教練仍可送審
- 新增 RoleAuthorizationTest:member/provider/admin/未登入跨角色測試,
  並驗證越權請求不產生資料;跨角色共用路由(通知、未讀訊息數)不受影響
- Swagger:member/provider 端點的 403 描述補上角色不符,補齊列表端點 403
- 更新 BookingListTest docblock 的過時描述
- 完成 tasks 1.1–4.3;5.1、5.2 手動驗證尚未執行

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
style: 以 pint 格式化 routes、Docs 與 BookingListTest
Run Tests / test (pull_request) Successful in 36s
90fc8f2d49
純格式調整,不改變行為。這四個檔案在 master 上即未通過 pint,
因本次功能變更觸及而一併修正,以符合變更檔案需通過 pint 的審查要求。

- 已驗證 route:list 除角色 middleware 外無差異
- 已驗證 l5-swagger 產出的 JSON 在格式化前後完全相同

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
a620906209 merged commit 544894fa55 into master 2026-10-17 16:12:03 +00:00
a620906209 deleted branch security/implement-role-middleware 2026-10-17 16:12:03 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: a620906209/CFDivePlatform#71