Files
alla-tms/plans/system-ui-permission-review-plan.md
2026-07-16 09:53:14 +07:00

530 lines
24 KiB
Markdown

# Prompt: ตรวจสอบการแสดงผลของระบบเทียบกับ Permission โดยยังไม่แก้ไขโค้ด
## เป้าหมาย
ให้ตรวจสอบระบบทั้งหมดว่า การแสดงผลของหน้า เมนู ปุ่ม ข้อมูล ฟิลด์ และ Action ต่าง ๆ สอดคล้องกับ Permission และ Role ที่ระบบกำหนดไว้จริงหรือไม่
งานนี้เป็น **Audit / Review เท่านั้น**
ห้ามแก้ไขโค้ด ห้ามเปลี่ยน Permission และห้ามปรับพฤติกรรมของระบบในขั้นตอนนี้
ผลลัพธ์ที่ต้องการคือรายงานปัญหา พร้อมหลักฐาน ตำแหน่งโค้ด ผลกระทบ และแนวทางแก้ไขสำหรับนำไปดำเนินการในขั้นตอนถัดไป
---
## ขอบเขตการตรวจสอบ
ตรวจสอบทั้งระบบ ครอบคลุมอย่างน้อยดังนี้
- Sidebar และ Navigation
- Dashboard
- หน้ารายการ
- หน้ารายละเอียด
- หน้าสร้างข้อมูล
- หน้าแก้ไขข้อมูล
- Dialog, Modal, Drawer, Sheet และ Dropdown Menu
- ปุ่ม Action ในตาราง
- ปุ่มสร้าง แก้ไข ลบ ส่งตรวจสอบ อนุมัติ ปฏิเสธ ส่งกลับ และเผยแพร่
- ข้อมูลภายใน Card, Table, Form และ Detail Section
- หมายเหตุการตรวจสอบ
- ประวัติการอนุมัติ
- Audit Log
- API Route
- Server Action
- Query และ Service Layer
- Middleware
- Route Guard
- Permission Helper
- Role Guard
- Component Guard
- Backend Authorization
ให้ตรวจสอบทุกโมดูลที่มีอยู่ในระบบ เช่น
- ผู้ใช้งานและพนักงาน
- ประวัติการอบรม
- บทเรียนออนไลน์
- ประกาศ
- การแจ้งเตือน
- นโยบาย
- การอนุมัติ
- รายงาน
- ตั้งค่าระบบ
- Audit Log
- โมดูลอื่น ๆ ที่ค้นพบในโครงการ
---
## Role และ Permission
ให้ค้นหา Role และ Permission จากโค้ดจริงก่อนเริ่มตรวจสอบ เช่น
- User / Employee
- Admin
- HRD Staff
- HRD Manager
- IT Admin
- Reviewer
- Approver
- Role อื่น ๆ ที่ระบบมีอยู่จริง
ห้ามสมมติชื่อ Role หรือ Permission จากเอกสารเพียงอย่างเดียว
ให้ค้นหาแหล่งกำหนด Permission ทั้งหมด เช่น
- Enum
- Constant
- Permission Matrix
- Database Schema
- Seed Data
- Middleware
- Session
- JWT
- Auth.js callback
- Route configuration
- Sidebar configuration
- Helper function เช่น `hasPermission`, `canAccess`, `canManage`
- Server-side authorization
- Client-side conditional rendering
จากนั้นจัดทำ Permission Matrix ที่อ้างอิงจากโค้ดจริงก่อนตรวจสอบหน้าจอ
---
## หลักการตรวจสอบ
การตรวจสอบต้องครอบคลุมทั้งสองระดับ
### 1. การแสดงผลฝั่ง Client
ตรวจสอบว่า Role หรือ Permission แต่ละประเภทเห็นเฉพาะสิ่งที่ควรเห็นหรือไม่ เช่น
- เมนูที่ไม่มีสิทธิ์ถูกซ่อนหรือไม่
- ปุ่มที่ไม่มีสิทธิ์ถูกซ่อนหรือ Disable อย่างถูกต้องหรือไม่
- ข้อมูลภายในหน้ารายละเอียดถูกกรองตามสิทธิ์หรือไม่
- ฟิลด์ภายใน Form แสดงตาม Role หรือ Status หรือไม่
- Action Menu แสดงเฉพาะ Action ที่ทำได้จริงหรือไม่
- ข้อความ หมายเหตุ และประวัติภายในระบบเปิดเผยเกินสิทธิ์หรือไม่
### 2. การบังคับสิทธิ์ฝั่ง Server
ห้ามสรุปว่าระบบปลอดภัยเพียงเพราะซ่อนปุ่มหรือซ่อนเมนูแล้ว
ต้องตรวจสอบด้วยว่า ผู้ไม่มีสิทธิ์สามารถเรียกใช้งานผ่าน URL, API, Server Action หรือ Request โดยตรงได้หรือไม่ เช่น
- เปิด URL โดยตรง
- เรียก API โดยตรง
- ส่ง Request จาก DevTools
- แก้ไข Parameter
- เปลี่ยน Record ID
- เรียก Server Action โดยไม่ผ่าน UI
- เข้าถึงข้อมูลของผู้ใช้งานรายอื่น
- แก้ไขข้อมูลของผู้ใช้งานรายอื่น
- เรียก Action ที่ UI ซ่อนไว้
---
## ประเด็นสำคัญที่ต้องตรวจสอบ
### A. เมนูและเส้นทาง
ตรวจสอบว่า
- Sidebar แสดงเมนูตาม Permission
- ผู้ไม่มีสิทธิ์ไม่สามารถเข้าหน้าผ่าน URL โดยตรง
- Route Guard และ Middleware ใช้เงื่อนไขเดียวกับ Sidebar
- ไม่มีหน้าที่ซ่อนเมนูแต่ยังเข้าผ่าน URL ได้
- ไม่มีหน้าที่ Sidebar แสดงให้เห็น แต่เข้าใช้งานจริงไม่ได้
- Redirect และ Forbidden Page ทำงานสม่ำเสมอ
### B. ปุ่มและ Action
ตรวจสอบทุก Action เช่น
- สร้าง
- บันทึกฉบับร่าง
- แก้ไข
- ลบ
- ส่งตรวจสอบ
- อนุมัติ
- ปฏิเสธ
- ส่งกลับแก้ไข
- เผยแพร่
- ยกเลิกเผยแพร่
- ปักหมุด
- นำเข้า
- ส่งออก
- ดาวน์โหลด
- จัดการ Permission
ตรวจสอบว่า
- ปุ่มแสดงเฉพาะ Role ที่มีสิทธิ์
- Action สอดคล้องกับสถานะข้อมูล
- Backend ตรวจ Permission ซ้ำ
- ไม่สามารถข้าม Workflow ได้
- ไม่มี Action ที่ UI แสดงแต่ Backend ปฏิเสธโดยไม่ตั้งใจ
- ไม่มี Action ที่ UI ซ่อน แต่ Backend ยังอนุญาต
### C. การแสดงข้อมูลละเอียดอ่อน
ตรวจสอบข้อมูลที่อาจไม่ควรแสดงแก่ผู้ใช้งานทั่วไป เช่น
- หมายเหตุการตรวจสอบ
- เหตุผลการปฏิเสธ
- Internal Comment
- Reviewer Note
- Approval Note
- Audit Log
- ชื่อผู้อนุมัติ
- ประวัติการแก้ไข
- Metadata ภายใน
- Permission หรือ Role ภายใน
- ข้อมูลพนักงานรายอื่น
- ข้อมูลสถานะภายใน Workflow
ให้ตรวจสอบเป็นพิเศษว่า หน้าผู้ใช้งานทั่วไปมีการแสดง “หมายเหตุการตรวจสอบ” หรือข้อมูลภายในของเจ้าหน้าที่โดยไม่ตั้งใจหรือไม่
### D. Ownership และขอบเขตข้อมูล
ตรวจสอบว่า
- ผู้ใช้งานทั่วไปเห็นเฉพาะข้อมูลของตนเอง
- เจ้าหน้าที่เห็นข้อมูลตามบริษัท ฝ่าย หรือขอบเขตที่กำหนด
- Reviewer และ Approver เห็นเฉพาะรายการที่เกี่ยวข้อง
- Admin เห็นข้อมูลทั้งหมดตามที่ออกแบบ
- การเปลี่ยน ID ใน URL หรือ Request ไม่ทำให้เข้าถึงข้อมูลของผู้อื่น
- Query มีเงื่อนไขกรองตาม Ownership และ Permission
- การ Export ไม่ส่งออกข้อมูลเกินสิทธิ์
- Search และ Filter ไม่สามารถใช้ดึงข้อมูลนอกขอบเขต
### E. Workflow และ Status
ตรวจสอบ Permission ร่วมกับสถานะ เช่น
- Draft
- Pending
- Submitted
- Approved
- Rejected
- Returned
- Published
- Archived
- Cancelled
- สถานะอื่นที่มีอยู่จริง
ตัวอย่างการตรวจสอบ
- เจ้าของรายการแก้ไขได้เฉพาะ Draft หรือ Returned หรือไม่
- เมื่อส่งตรวจสอบแล้ว ผู้ใช้งานยังแก้ไขได้หรือไม่
- ผู้ใช้งานเห็นรายการ Rejected หรือ Returned ตามที่กำหนดหรือไม่
- Reviewer เห็นรายการที่ต้องตรวจสอบจริงหรือไม่
- Approver สามารถอนุมัติรายการที่ยังไม่ถึงขั้นตนเองหรือไม่
- รายการ Published แสดงแก่ผู้ใช้งานตามเงื่อนไขหรือไม่
- การแสดงปุ่มสอดคล้องกับ Permission และ Status พร้อมกันหรือไม่
---
## วิธีดำเนินการ
### ขั้นตอนที่ 1: สำรวจโครงสร้าง Permission
ค้นหาและสรุป
- Role ทั้งหมด
- Permission ทั้งหมด
- Mapping ระหว่าง Role และ Permission
- Permission Helper ทั้งหมด
- Route Guard
- API Guard
- Server Action Guard
- Ownership Rule
- Status Rule
### ขั้นตอนที่ 2: จัดทำ Permission Matrix
จัดทำตารางในรูปแบบประมาณนี้
| Module | Page / Action | User | Staff | Manager | Admin | เงื่อนไขเพิ่มเติม |
| -------------- | -------------------- | ---------: | ----: | ------: | ------: | ----------------------- |
| Online Lessons | ดูรายการเผยแพร่ | Yes | Yes | Yes | Yes | เฉพาะ Published |
| Online Lessons | ดูหมายเหตุการตรวจสอบ | No | Yes | Yes | Yes | ผู้ใช้งานทั่วไปห้ามเห็น |
| Online Lessons | แก้ไข Draft | Owner only | Yes | Yes | Yes | ตาม Ownership |
| Online Lessons | อนุมัติ | No | No | Yes | ตามระบบ | Pending เท่านั้น |
ให้ใช้ Role จริงจากระบบแทนตัวอย่างข้างต้น
### ขั้นตอนที่ 3: ตรวจสอบ UI กับ Matrix
ตรวจสอบทุกหน้าและ Component ว่า
- Render Condition ถูกต้องหรือไม่
- ใช้ Permission Helper มาตรฐานหรือไม่
- มีการ Hardcode Role หรือไม่
- มี Logic ซ้ำซ้อนหรือขัดแย้งกันหรือไม่
- มีการตรวจเฉพาะ Role แต่ไม่ตรวจ Permission หรือไม่
- มีการตรวจเฉพาะ Status แต่ไม่ตรวจ Role หรือไม่
- มีการซ่อนด้วย CSS โดยไม่ได้หยุดการ Render หรือไม่
### ขั้นตอนที่ 4: ตรวจสอบ Backend กับ Matrix
ตรวจสอบ
- API Route
- Route Handler
- Server Action
- Service Function
- Repository
- Database Query
ให้ยืนยันว่าแต่ละ Action ตรวจสอบครบทั้ง
1. Authentication
2. Role หรือ Permission
3. Ownership หรือ Data Scope
4. Record Status
5. Input Validation
### ขั้นตอนที่ 5: ตรวจหาความไม่สอดคล้อง
จัดประเภทปัญหาอย่างน้อยดังนี้
- UI แสดงเกินสิทธิ์
- UI ซ่อนผิด แม้มีสิทธิ์
- เข้าผ่าน URL โดยตรงได้
- API ไม่มี Authorization
- Server Action ไม่มี Authorization
- Data Query ไม่กรอง Ownership
- Export ข้อมูลเกินสิทธิ์
- Role และ Permission Logic ไม่ตรงกัน
- Permission Logic กระจายหลายจุด
- Hardcoded Role
- Status Guard ไม่ครบ
- ข้อมูลภายในรั่วไปยังผู้ใช้งานทั่วไป
- Client และ Server ใช้เงื่อนไขต่างกัน
- Permission Matrix ไม่ตรงกับการทำงานจริง
---
## สิ่งที่ห้ามทำ
- ห้ามแก้ไขไฟล์ใด ๆ
- ห้าม Refactor
- ห้ามเปลี่ยน Permission
- ห้ามเปลี่ยน Role
- ห้ามแก้ Middleware
- ห้ามแก้ Component
- ห้ามแก้ API
- ห้ามแก้ Server Action
- ห้ามแก้ Database Schema
- ห้ามสร้าง Migration
- ห้ามรันคำสั่งที่แก้ไขข้อมูล
- ห้ามลบหรือเพิ่ม Dependency
- ห้าม Commit
- ห้าม Push
- ห้ามสรุปจากชื่อไฟล์โดยไม่ได้อ่าน Logic จริง
อนุญาตเฉพาะการอ่าน วิเคราะห์ ค้นหา และจัดทำรายงาน
---
## รูปแบบรายงานที่ต้องส่งมอบ
สร้างไฟล์
```text
permission-display-audit.md
```
โดยมีโครงสร้างดังนี้
# Permission and Display Audit Report
## 1. Executive Summary
สรุปภาพรวมว่า
- ระบบสอดคล้องกับ Permission มากน้อยเพียงใด
- พบ Critical, High, Medium และ Low กี่รายการ
- โมดูลใดมีความเสี่ยงสูง
- มีข้อมูลใดถูกแสดงเกินสิทธิ์หรือไม่
- Backend บังคับ Permission ครบถ้วนหรือไม่
## 2. Roles and Permissions Discovered
ระบุ
- Role ที่พบ
- Permission ที่พบ
- แหล่งที่กำหนด
- File path
- Logic โดยย่อ
## 3. Permission Matrix
ตารางสิทธิ์ของทุกโมดูล ทุกหน้า และทุก Action
## 4. Route and Navigation Audit
ตาราง
| ID | Route | Menu Permission | Route Guard | Direct URL Result | Status |
| --- | ----- | --------------- | ----------- | ----------------- | ------ |
## 5. UI Display Audit
ตาราง
| ID | Module | Page / Component | Element | Expected | Actual | Severity | Evidence |
| --- | ------ | ---------------- | ------- | -------- | ------ | -------- | -------- |
## 6. Backend Authorization Audit
ตาราง
| ID | Endpoint / Action | Authentication | Permission | Ownership | Status Guard | Result |
| --- | ----------------- | -------------- | ---------- | --------- | ------------ | ------ |
## 7. Findings
สำหรับแต่ละปัญหา ให้ใช้รูปแบบ
### PERM-001: ชื่อปัญหา
- Severity:
- Module:
- Affected roles:
- Expected behavior:
- Actual behavior:
- Security or business impact:
- Root cause:
- Evidence:
- File path:
- Line or code reference:
- Reproduction steps:
- Recommended remediation:
- Related findings:
## 8. Role-based Test Scenarios
จัดทำกรณีทดสอบสำหรับแต่ละ Role เช่น
| Test ID | Role | Page | Action | Expected Result |
| ------- | ---- | ---- | ------ | --------------- |
ต้องครอบคลุมอย่างน้อย
- เปิดเมนู
- เปิด URL โดยตรง
- ดูรายการ
- ดูรายละเอียด
- สร้าง
- แก้ไข
- ลบ
- ส่งตรวจสอบ
- อนุมัติ
- ปฏิเสธ
- ส่งกลับ
- Export
- เข้าถึงข้อมูลของผู้อื่น
- เปลี่ยน Record ID
- เรียก API โดยตรง
## 9. Prioritized Remediation Plan
จัดลำดับแนวทางแก้ไข โดยยังไม่แก้โค้ด
### Priority 0 — Critical Security
ปัญหาที่ทำให้ผู้ไม่มีสิทธิ์เข้าถึงหรือแก้ไขข้อมูลได้
### Priority 1 — Permission Mismatch
UI และ Backend ใช้เงื่อนไขไม่ตรงกัน
### Priority 2 — Data Exposure
ข้อมูลภายในหรือหมายเหตุแสดงเกินสิทธิ์
### Priority 3 — Maintainability
Permission Logic ซ้ำซ้อน กระจาย หรือ Hardcode
## 10. Files Reviewed
ระบุไฟล์ทั้งหมดที่ตรวจสอบ พร้อมเหตุผลที่เกี่ยวข้อง
## 11. Files Not Reviewed or Limitations
ระบุส่วนที่ไม่สามารถตรวจสอบได้ พร้อมเหตุผลอย่างตรงไปตรงมา
## 12. Final Assessment
สรุปว่า
- ระบบพร้อมใช้งานในด้าน Permission หรือไม่
- ประเด็นใดต้องแก้ก่อน Production
- ประเด็นใดสามารถวางแผนแก้ภายหลัง
- ความเสี่ยงที่ยังเหลืออยู่
---
## ระดับความรุนแรง
### Critical
- ผู้ไม่มีสิทธิ์เข้าถึงหรือแก้ไขข้อมูลสำคัญได้
- API หรือ Server Action ไม่มี Authorization
- เปลี่ยน Record ID แล้วเข้าถึงข้อมูลของผู้อื่นได้
- สามารถข้าม Workflow หรืออนุมัติแทน Role อื่นได้
### High
- UI หรือ Route แสดงข้อมูลละเอียดอ่อนเกินสิทธิ์
- Permission ระหว่าง Client และ Server ไม่ตรงกัน
- Ownership Rule ไม่ครบ
- Export ข้อมูลเกินขอบเขต
### Medium
- ปุ่มแสดงหรือซ่อนผิด
- Status และ Permission ไม่สัมพันธ์กัน
- ผู้มีสิทธิ์ใช้งานไม่ได้ตามปกติ
- Logic ซ้ำซ้อนและเสี่ยงเกิดความไม่สอดคล้อง
### Low
- ข้อความไม่เหมาะสมกับ Role
- UI สื่อความหมาย Permission ไม่ชัด
- Code Quality หรือ Maintainability ที่ยังไม่ทำให้สิทธิ์ผิดทันที
---
## เกณฑ์การตรวจสอบเพิ่มเติม
- อ้างอิงจากโค้ดจริง ไม่อ้างอิงเฉพาะ Requirement
- ทุก Finding ต้องมี File path หรือหลักฐาน
- แยก Expected กับ Actual ให้ชัดเจน
- ห้ามรายงานเป็นข้อสันนิษฐานโดยไม่มีหลักฐาน
- เมื่อไม่แน่ใจให้ระบุว่า “ต้องยืนยันเพิ่มเติม”
- ตรวจสอบทั้ง Client และ Server เสมอ
- ให้ความสำคัญกับ Security มากกว่าการซ่อน UI
- ห้ามใช้คำว่า “ผ่าน” หากตรวจเพียงฝั่งหน้าเว็บ
- ตรวจสอบว่าการใช้ `role`, `permission`, `status` และ `ownership` เป็นมาตรฐานเดียวกันทั้งระบบหรือไม่
---
## คำสั่งสุดท้าย
เริ่มจากสำรวจโครงสร้างโปรเจกต์และ Permission ทั้งหมดก่อน จากนั้นตรวจสอบการแสดงผลและการเข้าถึงของระบบทุกโมดูล
งานนี้ให้ดำเนินการเฉพาะการตรวจสอบและจัดทำรายงานเท่านั้น ห้ามแก้ไขโค้ดทุกกรณี
เมื่อเสร็จแล้วให้สรุปในข้อความตอบกลับว่า
1. พบปัญหาทั้งหมดกี่รายการ แยกตาม Severity
2. โมดูลใดมีความเสี่ยงสูงที่สุด
3. มีกรณีข้อมูลแสดงเกินสิทธิ์หรือไม่
4. มี API หรือ Server Action ที่ไม่มี Authorization หรือไม่
5. สร้างไฟล์รายงานไว้ที่ตำแหน่งใด
6. ยืนยันว่าไม่มีการแก้ไขโค้ดหรือข้อมูลในระบบ