Skip to content

ADR-0003. Tạm bỏ qua authorization trên route read License

TrườngGiá trị
StatusAccepted
Date2026-04-15
DecidersPhat Nguyen
Supersedes-

Bối cảnh

  • LicenseController được dựng từ ControllerFactory.defineCrudController với permission authorize riêng cho từng route (License.find, License.findById, License.count, License.findOne).
  • Authorization của Casbin diễn ra theo từng merchant (domain = x-merchant-id). Nhưng một license lại được truy vấn theo entity (một User hoặc Merchant) trước khi merchant được chọn - ví dụ trong giai đoạn onboarding, user chưa có domain merchant nào đang hoạt động.
  • Khi bật authz theo merchant, các thao tác đọc này sẽ trả về 403 cho những luồng hợp lệ chạy trước khi có merchant (onboarding dùng thử miễn phí, tra cứu license theo entity).
  • Các route ghi (create, updateById, deleteById, deleteBy) và các hành động vòng đời không bị ảnh hưởng - chúng vẫn giữ cổng kiểm tra permission.

Quyết định

Chúng ta sẽ đặt authorize: { skip: true } trên bốn route đọc License (find, findById, count, findOne), khiến chúng chỉ yêu cầu authenticate (JWT hoặc Basic). Các dòng authorize gốc được giữ lại dưới dạng comment ngay tại chỗ để có thể khôi phục khi thiết kế scoping theo merchant ("option B") hoàn tất.

Đây rõ ràng là giải pháp tạm thời và được đánh dấu TEMP(authz-skip) trong mã nguồn.

Hệ quả

ƯuNhược
Các luồng onboarding trước khi có merchant chạy được, không bị 403Các thao tác đọc License được authenticate nhưng không authorize - bất kỳ caller nào đã đăng nhập đều đọc được các bản ghi license
Không cần thay đổi IGNIS / ControllerFactoryĐể lại một dấu nợ bảo mật cần phải trả về sau
Có thể đảo ngược - các permission để dạng comment đã ghi lại trạng thái đíchDễ quên; chỉ dựa vào comment TEMP + ADR này để theo dõi

Phương án đã cân nhắc

Phương ánƯuNhượcVì sao loại
Giữ authz trên các route đọcKiểm soát đầy đủLàm hỏng onboarding trước khi có merchant (không có domain để scope)Chặn một luồng cốt lõi
Thêm một route "tra cứu theo entity" riêng, không cần xác thựcBề mặt hẹpThêm route + schema mới; trùng lặp với CRUDNhiều code cho một trạng thái tạm
Hiện thực authz theo entity (không theo merchant) ngay bây giờĐúng về dài hạnThiết kế lớn hơn ("option B"); chưa sẵn sàngHoãn lại, không phải từ bỏ

Tham chiếu

  • licensing/src/controllers/license/license.controller.ts - routes.{find,findById,count,findOne}.authorize.skip + comment TEMP(authz-skip)
  • Xem user memory: bật lại authorization theo merchant (Casbin domains, x-merchant-id)

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.