#backend#go#http#router#middleware
Router, middleware และแผนผัง route
NewRouter (router.go:59) สร้าง chi router ตัวเดียวที่รวมทุก route: กลุ่มแกนกลาง (/auth, /query, /blob, /admin/providers) ที่ต้องมีเสมอ และกลุ่มโมดูล (/api/v1/..., /process, /mcp) ที่ลงทะเบียนเฉพาะเมื่อ ExtraHandlers มี handler นั้นไม่ใช่ nil (router.go:40-57,121). แคตตาล็อก endpoint รายละเอียดของโมดูลอยู่นอกขอบเขตโน้ตนี้ — ที่นี่สรุปโครงและกติกาการป้องกัน.
ทำงานอย่างไร
- ชั้นนอกสุด (ทุกคำขอ) ตามลำดับ
router.go:62-66:RequestID→Recoverer→Timeout(60s)→SecurityHeaders→RequestLogger.SecurityHeadersเรียกsecurity.SetSecureHeaders(middleware.go:18-23) ดู เครื่องมือกลาง platform: docno, sqllit, search, security (Platform utilities).RequestLoggerlog 1 บรรทัด/คำขอ: method, path, status, duration, request_id (middleware.go:26-45) — ไม่ log body/query string.
GET /healthเสมอ (router.go:68);GET /swagger/*เฉพาะเมื่อenv == "development"(:69-71) (การ build และ deploy backend: Docker, Kubernetes, Makefile (Deployment)).- กลุ่มแกนกลางลงทะเบียนเสมอ; กลุ่มโมดูลตรวจ
ex.X != nilทีละกลุ่ม. queryWriteGuard=RequireRight(Rights, processhttp.QueryRequiredRight)สร้างเฉพาะเมื่อมีRights(router.go:86-89); ถ้าไม่มี route เขียนจะไม่ถูกคุมสิทธิ์เมนู (ในdiส่งRights: identityServiceเสมอ ดู สถาปัตยกรรม Hexagonal และ composition root ของ Go backend (Hexagonal Architecture + DI)).
แผนผัง route
| กลุ่ม | route | การป้องกัน | หมายเหตุ |
|---|---|---|---|
/auth |
POST /login, /select-company, /refresh, /logout |
ไม่มี (เป็นทางเข้า) | router.go:73-77 (ขั้นตอน login / เลือกบริษัท / refresh / logout (Identity login flow)) |
/auth |
GET /me |
Auth |
:79-81 |
/query |
POST /list, /limit, /batch |
Auth |
:90-94,102 (Query Gateway: /query/list, limit, batch, exec, execBatch) |
/query |
POST /exec, /execBatch |
Auth + queryWriteGuard |
:95-101 (นโยบายล็อกการเขียนผ่าน Query Gateway (Query write policy / lockdown)) |
/blob |
POST /insert |
Auth + queryWriteGuard |
:105-111 (แทรกแถวพร้อมรูปภาพ: POST /blob/insert + MinIO (Blob insert)) |
/admin/providers |
POST /, GET / |
AdminAuth (X-Admin-Api-Key) |
:114-120 (ทะเบียน Provider แบบไฟล์ JSON (Provider registry)) |
/process และ /api/v1/process |
ชุด endpoint เดียวกัน 2 prefix | Auth + RequireRight(routeRights) |
:127-209 (engine นอกขอบเขต ดู ภาพรวมกลุ่ม process ของ Backend (Process overview)) |
/api/v1/admin |
providers, users, databases, database-info, main-query, menu-permissions, workspace/* | AdminAuth |
:213-250 (Admin API สำหรับจัดการ Provider/ผู้ใช้/ฐานข้อมูล/สิทธิ์เมนู (Admin API), Workspace Google: ล็อกอินด้วยอีเมล สร้างบริษัทใหม่ สมาชิก และผูก LINE (Workspace Google API)) |
/api/v1/dashboard |
GET /overview |
Auth |
:253-255 |
/api/v1/crm |
GET /image, /overview, /activities; POST /activities, /upload |
Auth |
:260-266 |
/api/v1/ai |
GET /context, POST /chat |
Auth |
:271-274 |
/api/v1/wms, tms, procure, etax, market, autocare |
endpoint ของโมดูล | Auth |
:277-325 |
/api/v1/pos |
shift, image + กลุ่ม DeviceOnly / UserOnly |
ex.Pos.Auth (ตัวพิเศษ) |
:328-351 (POS Sync API: เครื่อง POS เชื่อมกับ Account (POS device sync)) |
/api/v1/monitormap |
GET /tile (ไม่ต้อง login), POST /tile (ต้อง Auth) |
แยกรายเมธอด | :354-360 |
/mcp, /api/v1/mcp |
GET/POST |
ตรวจ token ใน handler เอง | :363-366 |
/api/v1/mcp/tokens |
list / create / revoke | AdminAuth |
:368-373 |
สิ่งที่ควรรู้
Auth(middleware/auth.go:39) อ่านAuthorization: Bearer <token>เรียกVerifyAccessTokenแล้วใส่SessionClaimsลง context (ClaimsFromContext); ล้มเหลวตอบ 401missing or invalid access token(JWT session token และการเพิกถอน (JWT + revocation store)).AdminAuth(adminauth.go:18) ใช้กุญแจADMIN_API_KEYเทียบแบบ constant-time; กุญแจว่าง = ปฏิเสธทุกคำขอ (ตัวแปรสภาพแวดล้อมและการโหลด config ของ backend (Environment config)).RequireRight(permission.go:62) รับฟังก์ชันที่คืนRightต่อคำขอ —/processใช้RequiredRight(maprouteRightsตาม path),/query/exec*และ/blob/insertใช้QueryRequiredRight(จำแนกตามคำสั่ง SQL) (สิทธิ์เมนูและ middleware RequireRight (Menu rights / permission)).- มี 2 prefix ซ้ำสำหรับ process (
/process/...และ/api/v1/process/...) ลงทะเบียนชุดเดียวกัน — คาดว่าไว้ให้ client เก่า/ใหม่ใช้ได้ทั้งคู่ (ยังไม่ยืนยันเจตนา). /api/v1/crm/imageคือ route จริง (router.go:262) แต่ URL ที่ฝังใน DB ตอน blob insert ขึ้นต้น/api/crm/image(แทรกแถวพร้อมรูปภาพ: POST /blob/insert + MinIO (Blob insert)).- route ของโมดูลส่วนใหญ่ ไม่ผ่าน
RequireRightมีแค่Auth(ผู้ล็อกอินแล้วเรียกได้) — โมดูลที่เขียนข้อมูลผ่านAllowDDL/ClientRequest=falseจึงข้ามนโยบายล็อกเขียนของ client (นโยบายล็อกการเขียนผ่าน Query Gateway (Query write policy / lockdown)). - ไม่ได้ตั้ง CORS ใน router (ไม่พบ middleware CORS ในไฟล์นี้) (ยังไม่ยืนยันว่ามี reverse proxy จัดการให้).
ที่มาในโค้ด
backend/internal/adapter/inbound/http/router.go:40-57—ExtraHandlers.backend/internal/adapter/inbound/http/router.go:59-121— middleware ชั้นนอก, auth, query, blob, admin/providers.backend/internal/adapter/inbound/http/router.go:121-376— กลุ่มโมดูล.backend/internal/adapter/inbound/http/middleware/middleware.go:18-45— headers + logger.backend/internal/adapter/inbound/http/middleware/auth.go:39—Auth.
ดูเพิ่ม
ภาพรวม Backend Go ของ SML Ai Account (Backend overview) · รูปแบบ error และ response ของ API (apperr + response helper) · สิทธิ์เมนูและ middleware RequireRight (Menu rights / permission) · สถาปัตยกรรม Hexagonal และ composition root ของ Go backend (Hexagonal Architecture + DI) · สารบัญ ADR ของ backend (Architecture Decision Records)