Lớp định danh toàn cục: User, GlobalSession, OAuth2 authorization-code — đăng nhập một lần ở Control Plane, vào nhiều workspace, mỗi workspace ký session cục bộ riêng.
| Thành phần | Vai trò |
|---|---|
| User · GlobalSession | Tài khoản toàn cục + phiên đăng nhập CP (cookie 7 ngày) |
| AuthClient · AuthorizationCode | OAuth2 client per-workspace · code TTL 60s đổi lấy identity |
| authService · ssoService · globalSessionService | Đăng ký/đăng nhập · cấp/đổi code · quản lý phiên |
| Session workspace | JWT cục bộ 24h — token WS A không dùng được ở WS B; CP check membership trước khi cấp |
permissionCache rỗng sau khi BE restart → user non-super bị 403 tới khi re-login (ghi chú sẵn trong authorize.js)| Tham chiếu | Khuyến nghị |
|---|---|
| Keycloak / Auth0 | Nhúng permission claims (hoặc epoch) vào JWT workspace, hoặc chuyển cache sang store bền (Redis/DB) — hết 403 sau restart, PAT hoạt động đúng |
| Keycloak single-logout | Bổ sung logout lan truyền: đăng xuất CP → vô hiệu session các workspace đang mở (hiện mỗi WS tự hết hạn 24h) |
| OWASP | Rate-limit đăng nhập + khóa tạm sau N lần sai (nếu chưa có) |
Core không phải module nghiệp vụ — thay ma trận vai trò bằng tác nhân × năng lực, kèm cơ chế/quyền gate từng năng lực. R đọc · W thực hiện · A duyệt.
| Năng lực | Cơ chế / quyền gate | SUPER | OWNER/QTHT | DEV | SVC | USER |
|---|---|---|---|---|---|---|
| Đăng ký / đăng nhập CP | form + rate-limit | — | — | — | — | W |
| Global session (của mình) | cookie og_global_session | R | — | — | — | W (logout) |
| Quản lý user CP | quyền admin CP | W | — | — | — | — |
| Cấp authorization code / đổi token | OAuth2 client per-WS | — | — | — | W (đổi code) | khởi phát |
| Quản lý AuthClient | quyền admin CP | W | — | — | — | — |
SUPER = super admin CP · OWNER/QTHT = chủ workspace / quản trị WS · DEV = developer/publisher · SVC = service-to-service (runtime/hook) · USER = người dùng cuối. Mục ghi (đích) = theo khuyến nghị P1–P5, chưa có ở hiện trạng.