- Add 3 user roles: user, admin, super_admin - Restrict LLM config management to super_admin only - Restrict audit logs and statistics to super_admin only - Update AdminPage with role-based tab visibility - Add complete 5 Why prompt from 5why-analyzer.jsx - Add system documentation and authorization guide - Add ErrorModal component and seed test users script 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
8.1 KiB
8.1 KiB
5 Why 根因分析系統 - 分層授權設計
版本: 1.0.0 更新日期: 2025-12-08
1. 角色定義
系統定義三個權限層級:
| 層級 | 角色代碼 | 角色名稱 | 說明 |
|---|---|---|---|
| L1 | user |
一般使用者 | 僅能使用分析功能,管理自己的資料 |
| L2 | admin |
管理員 | 可管理使用者、查看所有分析、配置 LLM |
| L3 | super_admin |
超級管理員 | 擁有所有權限,包括刪除使用者、系統級操作 |
2. 權限矩陣
2.1 分析功能 (/api/analyze)
| 功能 | API 端點 | user | admin | super_admin |
|---|---|---|---|---|
| 建立分析 | POST / |
✅ | ✅ | ✅ |
| 翻譯分析 | POST /translate |
✅ | ✅ | ✅ |
| 查看自己的歷史 | GET /history |
✅ | ✅ | ✅ |
| 查看自己的分析 | GET /:id |
✅ | ✅ | ✅ |
| 查看他人的分析 | GET /:id |
❌ | ✅ | ✅ |
| 刪除自己的分析 | DELETE /:id |
✅ | ✅ | ✅ |
| 刪除他人的分析 | DELETE /:id |
❌ | ✅ | ✅ |
2.2 使用者管理 (/api/admin/users)
| 功能 | API 端點 | user | admin | super_admin |
|---|---|---|---|---|
| 查看使用者列表 | GET /users |
❌ | ✅ | ✅ |
| 建立使用者 | POST /users |
❌ | ✅ | ✅ |
| 編輯使用者 | PUT /users/:id |
❌ | ✅ | ✅ |
| 停用使用者 (軟刪除) | PUT /users/:id |
❌ | ✅ | ✅ |
| 刪除使用者 (硬刪除) | DELETE /users/:id |
❌ | ❌ | ✅ |
2.3 LLM 配置管理 (/api/llm-config)
| 功能 | API 端點 | user | admin | super_admin |
|---|---|---|---|---|
| 查看 LLM 配置列表 | GET / |
✅ | ✅ | ✅ |
| 查看啟用的配置 | GET /active |
✅ | ✅ | ✅ |
| 新增 LLM 配置 | POST / |
❌ | ❌ | ✅ |
| 編輯 LLM 配置 | PUT /:id |
❌ | ❌ | ✅ |
| 啟用 LLM 配置 | PUT /:id/activate |
❌ | ❌ | ✅ |
| 刪除 LLM 配置 | DELETE /:id |
❌ | ❌ | ✅ |
| 測試 LLM 連線 | POST /test |
❌ | ❌ | ✅ |
2.4 系統管理 (/api/admin)
| 功能 | API 端點 | user | admin | super_admin |
|---|---|---|---|---|
| 查看儀表板 | GET /dashboard |
❌ | ✅ | ✅ |
| 查看所有分析記錄 | GET /analyses |
❌ | ✅ | ✅ |
| 查看稽核日誌 | GET /audit-logs |
❌ | ❌ | ✅ |
| 查看系統統計 | GET /statistics |
❌ | ❌ | ✅ |
2.5 帳號功能 (/api/auth)
| 功能 | API 端點 | user | admin | super_admin |
|---|---|---|---|---|
| 登入 | POST /login |
✅ | ✅ | ✅ |
| 登出 | POST /logout |
✅ | ✅ | ✅ |
| 查看自己的資料 | GET /me |
✅ | ✅ | ✅ |
| 修改自己的密碼 | POST /change-password |
✅ | ✅ | ✅ |
3. 中介層實作
3.1 現有中介層 (middleware/auth.js)
// L1: 一般使用者 - 僅需登入
export function requireAuth(req, res, next)
// L2: 管理員 - 需要 admin 或 super_admin 角色
export function requireAdmin(req, res, next)
// L3: 超級管理員 - 僅允許 super_admin 角色
export function requireSuperAdmin(req, res, next)
// 資源擁有權檢查 - 一般使用者只能存取自己的資源
export function requireOwnership(resourceUserIdParam)
3.2 權限檢查流程
請求進入
│
▼
┌─────────────────┐
│ requireAuth │ ─── 未登入 ──→ 401 Unauthorized
└────────┬────────┘
│ 已登入
▼
┌─────────────────┐
│ requireAdmin? │ ─── 角色不符 ──→ 403 Forbidden
│ requireSuper? │
└────────┬────────┘
│ 權限通過
▼
┌─────────────────┐
│ requireOwnership│ ─── 非本人且非管理員 ──→ 403 Forbidden
└────────┬────────┘
│ 全部通過
▼
執行業務邏輯
4. 測試帳號
| 角色 | 密碼 | 工號 | |
|---|---|---|---|
| super_admin | admin@example.com | Admin@123456 | ADMIN001 |
| admin | manager@example.com | Manager@123456 | MGR001 |
| user | user001@example.com | User@123456 | EMP001 |
| user | user002@example.com | User@123456 | EMP002 |
5. 前端頁面權限控制
5.1 導航選單顯示
| 選單項目 | user | admin | super_admin |
|---|---|---|---|
| 5 Why 分析 | ✅ | ✅ | ✅ |
| 分析歷史 | ✅ | ✅ | ✅ |
| 管理員面板 | ❌ | ✅ | ✅ |
5.2 管理員面板標籤頁
| 標籤頁 | admin | super_admin |
|---|---|---|
| 儀表板 | ✅ | ✅ |
| 使用者管理 | ✅ | ✅ |
| 分析記錄 | ✅ | ✅ |
| LLM 配置 | ✅ | ✅ |
| LLM 測試台 | ✅ | ✅ |
| 稽核日誌 | ✅ | ✅ |
5.3 操作按鈕顯示
| 操作 | admin | super_admin |
|---|---|---|
| 新增使用者 | ✅ | ✅ |
| 編輯使用者 | ✅ | ✅ |
| 停用使用者 | ✅ | ✅ |
| 刪除使用者 | ❌ | ✅ |
6. 資料庫角色欄位
6.1 users 表結構
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
employee_id VARCHAR(50) UNIQUE,
username VARCHAR(100),
email VARCHAR(255) UNIQUE,
password_hash VARCHAR(255),
role ENUM('user', 'admin', 'super_admin') DEFAULT 'user',
department VARCHAR(100),
position VARCHAR(100),
is_active TINYINT(1) DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
last_login_at TIMESTAMP
);
6.2 角色值說明
| role 值 | 說明 |
|---|---|
user |
一般使用者,預設值 |
admin |
管理員 |
super_admin |
超級管理員 |
7. Session 結構
登入成功後,Session 中儲存以下資訊:
req.session = {
userId: 123, // 使用者 ID
userRole: 'admin', // 角色代碼
employeeId: 'EMP001', // 工號
username: '王小明' // 使用者名稱
}
8. 權限擴展建議
8.1 未來可考慮的權限細分
| 權限代碼 | 說明 | 建議角色 |
|---|---|---|
analysis.create |
建立分析 | user, admin, super_admin |
analysis.view.own |
查看自己的分析 | user, admin, super_admin |
analysis.view.all |
查看所有分析 | admin, super_admin |
analysis.delete.own |
刪除自己的分析 | user, admin, super_admin |
analysis.delete.all |
刪除所有分析 | admin, super_admin |
user.manage |
管理使用者 | admin, super_admin |
user.delete |
刪除使用者 | super_admin |
llm.configure |
配置 LLM | admin, super_admin |
system.audit |
查看稽核日誌 | admin, super_admin |
8.2 實作 RBAC (Role-Based Access Control)
未來可擴展為更靈活的權限系統:
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Users │────▶│ Roles │────▶│Permissions│
└──────────┘ └──────────┘ └──────────┘
│ │ │
│ │ │
user_id role_id permission_id
9. 安全性考量
9.1 已實作
- 密碼使用 bcrypt 加密 (cost factor: 10)
- Session-based 認證
- 前後端雙重權限檢查
- 稽核日誌記錄所有敏感操作
- 軟刪除保留資料完整性
9.2 建議加強
- 密碼複雜度驗證
- 登入失敗次數限制
- Session 過期時間設定
- IP 白名單 (管理功能)
- 雙因素認證 (2FA)
附錄:快速參考
檢查使用者權限的程式碼
// 檢查是否為管理員
const isAdmin = ['admin', 'super_admin'].includes(req.session.userRole);
// 檢查是否為超級管理員
const isSuperAdmin = req.session.userRole === 'super_admin';
// 檢查是否為資源擁有者或管理員
const canAccess = resource.user_id === req.session.userId || isAdmin;
文件版本: 1.0.0 編寫日期: 2025-12-08 編寫者: Development Team