- 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>
280 lines
8.1 KiB
Markdown
280 lines
8.1 KiB
Markdown
# 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`)
|
||
|
||
```javascript
|
||
// 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. 測試帳號
|
||
|
||
| 角色 | Email | 密碼 | 工號 |
|
||
|------|-------|------|------|
|
||
| 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 表結構
|
||
|
||
```sql
|
||
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 中儲存以下資訊:
|
||
|
||
```javascript
|
||
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 已實作
|
||
|
||
- [x] 密碼使用 bcrypt 加密 (cost factor: 10)
|
||
- [x] Session-based 認證
|
||
- [x] 前後端雙重權限檢查
|
||
- [x] 稽核日誌記錄所有敏感操作
|
||
- [x] 軟刪除保留資料完整性
|
||
|
||
### 9.2 建議加強
|
||
|
||
- [ ] 密碼複雜度驗證
|
||
- [ ] 登入失敗次數限制
|
||
- [ ] Session 過期時間設定
|
||
- [ ] IP 白名單 (管理功能)
|
||
- [ ] 雙因素認證 (2FA)
|
||
|
||
---
|
||
|
||
## 附錄:快速參考
|
||
|
||
### 檢查使用者權限的程式碼
|
||
|
||
```javascript
|
||
// 檢查是否為管理員
|
||
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
|