Phân quyền Board — tra cứu đầy đủ
Nguyên tắc nền: role chỉ đến từ bảng
space_members. Không header nào, không token nào nâng quyền được. Không có bản ghi membership → 403, kể cảGET.
viewer < member < admin < owner
Ma trận quyền theo hành động
| Hành động | API | Quyền tối thiểu | Ràng buộc thêm |
|---|---|---|---|
| Xem Space, task, wiki, plan, group | GET /api/… | viewer | |
| Tạo / sửa / xoá task | POST·PATCH·DELETE /api/tasks* | member | |
| Tạo task hàng loạt | POST /api/tasks/batch | member | Kiểm quyền ở mọi Space được tham chiếu |
| Chạy / dừng agent | POST /api/tasks/:id/run·stop | member | |
| Tạo & sửa kế hoạch | POST·PATCH /api/plans* | member | |
| Apply Plan | POST /api/plans/:id/apply | member | |
| Tạo / chạy Task Group | POST /api/groups* | member | |
| Ghi Wiki draft | POST /api/wiki/drafts | member | |
| Approve & Merge | POST /api/tasks/:id/approve | admin | ⚠️ Bắt buộc actor.type === 'human' |
| Request Changes / Rework | POST /api/tasks/:id/rework | admin | ⚠️ Bắt buộc actor.type === 'human' |
| Sửa cấu hình Space | PATCH·DELETE /api/projects/:id | owner | |
| Thêm / xoá thành viên | POST·DELETE /api/spaces/:id/members | owner | Không xoá được owner cuối cùng (409) |
| Tạo Space mới | POST /api/projects | (chỉ cần đăng nhập) | Người tạo tự động thành owner |
Route chưa khai báo trong
AUTHZ_RULES → 403Mặc định là chặn, không phải cho qua. Thêm endpoint mới mà quên khai báo rule là endpoint đó không dùng được — đây là chủ ý.
Quản lý thành viên
# Xem danh sách
curl http://<host>/api/spaces/<spaceId>/members
# Thêm / đổi role
curl -X POST http://<host>/api/spaces/<spaceId>/members \
-H 'Content-Type: application/json' \
-d '{"email":"bob@corp.com","role":"member"}'
# Xoá
curl -X DELETE http://<host>/api/spaces/<spaceId>/members/bob@corp.com
Mất hết quyền quản trị? Đặt AGENTBOARD_BOOTSTRAP_OWNERS=you@corp.com rồi restart server.
Lệnh grant là idempotent — vừa là đường khởi tạo lần đầu, vừa là đường break-glass.
Chi tiết: Tạo Space & quản thành viên.