ADR-0003. Tạm bỏ qua authorization trên route read License
| Trường | Giá trị |
|---|---|
| Status | Accepted |
| Date | 2026-04-15 |
| Deciders | licensing-team, identity-team |
| Supersedes | — |
Bối cảnh
LicenseControllerđược dựng từControllerFactory.defineCrudControllervới permissionauthorizetheo từng route (License.find,License.findById,License.count,License.findOne).- Authorization Casbin là theo từng merchant (domain =
x-merchant-id). Nhưng một license được query theoentity(mộtUserhoặcMerchant) trước khi một merchant được chọn — vd trong onboarding, user chưa có domain merchant active. - Với authz theo merchant bật, các read này sẽ 403 cho luồng pre-merchant hợp lệ (onboarding free-trial, khám phá license theo entity).
- Route write (
create,updateById,deleteById,deleteBy) và các hành động vòng đời không bị ảnh hưởng — chúng giữ cổng permission.
Quyết định
Chúng ta sẽ đặt authorize: { skip: true } trên bốn route read License (find, findById, count, findOne), để chúng chỉ authenticate (JWT hoặc Basic). Các dòng authorize gốc giữ comment tại chỗ để có thể khôi phục khi thiết kế scoping theo merchant ("option B") sẵn sàng.
Điều này rõ ràng tạm thời và đánh dấu TEMP(authz-skip) trong source.
Hệ quả
| Ưu | Nhược |
|---|---|
| Luồng onboarding pre-merchant chạy không 403 | Read License được authenticate nhưng không authorize — bất kỳ caller đăng nhập nào đều đọc được hàng license |
Không cần đổi IGNIS / ControllerFactory | Mang một marker nợ bảo mật phải trả |
| Có thể đảo ngược — permission comment ghi lại trạng thái đích | Dễ quên; dựa vào comment TEMP + ADR này để theo dõi |
Phương án đã cân nhắc
| Phương án | Ưu | Nhược | Vì sao loại |
|---|---|---|---|
| Giữ authz trên read | Có cổng đầy đủ | Hỏng onboarding pre-merchant (không domain để scope) | Chặn một luồng cốt lõi |
| Thêm route "discover by entity" riêng không xác thực | Bề mặt hẹp | Route + schema mới; lặp CRUD | Nhiều code cho một trạng thái tạm |
| Hiện thực authz theo-entity (phi-merchant) ngay | Đúng dài hạn | Thiết kế lớn hơn ("option B"); chưa sẵn | Hoãn lại, không bỏ |
Tham chiếu
licensing/src/controllers/license/license.controller.ts—routes.{find,findById,count,findOne}.authorize.skip+ commentTEMP(authz-skip)- Xem user memory: bật lại authorization theo merchant (Casbin domains,
x-merchant-id)