#process#permission#rights#security#middleware
การตรวจสิทธิ์เมนูของ route process (Process route rights)
ทุกคำขอใต้ /process และ /api/v1/process ผ่าน middleware.RequireRight ซึ่งถามฟังก์ชัน processhttp.RequiredRight(r) ว่า "route นี้ต้องใช้สิทธิ์อะไร" แล้วเทียบกับ MenuRights ของผู้ใช้ใน session ถ้าไม่ครอบคลุมตอบ 403 พร้อมข้อความไทย
ทำงานอย่างไร
ชนิดสิทธิ์ (middleware.Right)
| ค่า | ความหมาย (ตามคอมเมนต์ในโค้ด) | Allows ตรวจกับ |
|---|---|---|
RightRead |
C# _isRead |
rights.Read |
RightWrite |
C# _isAdd หรือ _isEdit (save/cancel/approve) |
Add || Edit |
RightDelete |
C# _isDelete |
rights.Delete |
RightAdmin |
ประมวลผลทั้งฐานข้อมูล: Admin เท่านั้น | ไม่มี case => false (ผ่านเฉพาะ rights.Admin) |
RightAdd |
C# _isAdd อย่างเดียว (master data: เพิ่มใหม่) |
rights.Add |
RightEdit |
C# _isEdit อย่างเดียว (master data: แก้ไข) |
rights.Edit |
rights.Admin == trueผ่านทุกกรณี (Allowsคืน true ก่อน switch)- ข้อความปฏิเสธเป็นภาษาไทยแยกตามชนิดสิทธิ์ใน
deniedMessages RequireRightต้องอยู่หลังAuth(ถ้าไม่มี claims ตอบ Unauthorized)
ตัวตัดสิน RequiredRight
- route ที่ขึ้นกับ body ใช้
peekJSON(อ่าน body ไม่เกิน 1 MB แล้วคืน body กลับให้ handler):report/run,report/pdf: ถ้ามีcustomSqlไม่ว่าง =>admin, ไม่งั้นread(ดู SQL กำหนดเองและเทมเพลตรายงาน (Custom SQL & report templates))stock/rebuild: ส่งItemCodes=>write, ไม่ส่ง =>admingl/rebuild: ส่งDocNo=>write, ไม่ส่ง =>adminitemmaster/save,trans/save,doc/save,stocktools/pointdocsave,stocktools/stockbeginningsave:IsNew=true=>RightAdd, ไม่งั้นRightEditmaster/datalistget,master/datalistsave: ถ้าUserCodeว่างหรือตรงกับclaims.Username=>read, ถ้าเป็นของคนอื่น =>adminworkflow/check-ic-trans:Apply=false=>read, ไม่งั้นadminbarcode/format:Action=save=>RightAdd,delete=>del, อื่น ๆ =>readworkflow/fa-depreciation:Delete=false=>writeไม่งั้นdelworkflow/asset-sale:Op=preview=>read,delete=>del, อื่น ๆ =>write
- อื่น ๆ ค้นตาราง
routeRights(key ="<กลุ่ม>/<action>"):- read: เช่น
report/run,report/pdf,doc/flow,lookup/*,barcode/item,transgrid/*,docpicture/get,itemdetail/get,modifyprice/preview,stocktools/formats,workflow/journal-list - write: เช่น
doc/save,doc/cancel,doc/approve,barcode/save,modifyprice/apply,master-detail/save,stocktools/hiddencostsave,workflow/journal-pass - delete: เช่น
trans/delete,doc/delete,master-detail/delete,itemmaster/delete - admin:
cheque/rebuild,tax/rebuild,workflow/gl-close,workflow/change-code,workflow/audit-list
- read: เช่น
- ไม่อยู่ในตาราง =>
admin(คอมเมนต์ในโค้ด: route ใหม่ถูกล็อกไว้จนกว่าจะมีคนจัดประเภท)
กรณีเฉพาะที่ควรรู้
- action
workflow/ai-*(เช่นai-report-sql,ai-audit-copilot) ไม่ปรากฏในrouteRightsที่อ่านจากpermission.go=> ตกเป็น Admin ตามกฎข้อ 2 (ข้อสรุปจากการอ่านตาราง ไม่ได้รันทดสอบ) QueryRequiredRight(บรรทัด 138) เป็นตัวตัดสินของ/query/exec,/query/execBatch,/blob/insert(นอก process): ดูคำสั่ง SQL ตัวแรก (insert=>Add,update=>Edit,delete=>Delete, อื่น ๆ=>Write); สำหรับ batch ที่แตะsml_audit_logใช้ค่าvalues (1,/(2,/(3,เป็นตัวบอก Add/Edit/Delete- สิทธิ์ที่นี่เป็นสิทธิ์ระดับเมนู/route คนละเรื่องกับสิทธิ์คลัง/ที่เก็บ ดู สิทธิ์คลัง/ที่เก็บรายกลุ่มผู้ใช้ (perm_wh_shelf)
ที่มาในโค้ด
backend/internal/adapter/inbound/http/middleware/permission.go:14-23- ชนิดRightและความหมายตาม C#backend/internal/adapter/inbound/http/middleware/permission.go:40-60-Allowsbackend/internal/adapter/inbound/http/middleware/permission.go:62-RequireRight(403 + ข้อความไทย)backend/internal/adapter/inbound/http/process/permission.go:23-55- ตารางrouteRightsbackend/internal/adapter/inbound/http/process/permission.go:57-132-RequiredRight(สวิตช์ตาม body และ fallback เป็น admin ที่บรรทัด 132)backend/internal/adapter/inbound/http/process/permission.go:138-QueryRequiredRightbackend/internal/adapter/inbound/http/process/permission.go:231-peekJSON