Skip to content

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

TrườngGiá trị
StatusAccepted
Date2026-04-15
Deciderslicensing-team, identity-team
Supersedes

Bối cảnh

  • LicenseController được dựng từ ControllerFactory.defineCrudController với permission authorize theo 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 theo entity (một User hoặc Merchant) 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ả

ƯuNhược
Luồng onboarding pre-merchant chạy không 403Read 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 / ControllerFactoryMang 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 đíchDễ quên; 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 readCó 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ựcBề mặt hẹpRoute + schema mới; lặp CRUDNhiề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ạnThiết kế lớn hơn ("option B"); chưa sẵnHoãn lại, không bỏ

Tham chiếu

  • licensing/src/controllers/license/license.controller.tsroutes.{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.