diff --git a/ADMIN_ACCESS_DENIED_FIX_SUMMARY.md b/ADMIN_ACCESS_DENIED_FIX_SUMMARY.md new file mode 100644 index 0000000..b016a34 --- /dev/null +++ b/ADMIN_ACCESS_DENIED_FIX_SUMMARY.md @@ -0,0 +1,187 @@ +# 管理員存取被拒問題修復總結 + +## 🎯 問題描述 + +管理員使用正確的帳號密碼登入後,訪問管理員後台時仍然顯示「存取被拒」錯誤。 + +## 🔍 問題分析 + +### 根本原因: +1. **服務器端渲染問題**:Next.js 在服務器端渲染時,`localStorage` 不可用 +2. **客戶端 hydration 時機**:用戶狀態需要等待客戶端載入 `localStorage` 資料 +3. **權限檢查邏輯**:在用戶狀態未載入時就進行權限檢查 + +### 問題流程: +1. 用戶訪問 `/admin` 頁面 +2. 服務器端渲染時,`localStorage` 不可用,`user` 為 `null` +3. 權限檢查 `!user || user.role !== "admin"` 返回 `true` +4. 顯示「存取被拒」頁面 +5. 客戶端 hydration 後,用戶狀態載入,但頁面已經渲染 + +## ✅ 修復方案 + +### 1. 添加初始化狀態管理 +**文件:** `contexts/auth-context.tsx` + +```typescript +// 添加初始化狀態 +const [isInitialized, setIsInitialized] = useState(false) + +useEffect(() => { + // Check for stored user session only on client side + if (typeof window !== 'undefined') { + const storedUser = localStorage.getItem("user") + if (storedUser) { + setUser(JSON.parse(storedUser)) + } + } + setIsLoading(false) + setIsInitialized(true) // 標記為已初始化 +}, []) +``` + +### 2. 改進權限檢查邏輯 +**文件:** `components/admin/admin-layout.tsx` + +```typescript +// 如果還在載入中或未初始化,顯示載入畫面 +if (!isClient || isLoading || !isInitialized) { + return ( +
載入中...
+您沒有管理員權限訪問此頁面
+ {process.env.NODE_ENV === 'development' && ( +
開發者>
+)}
+{displayRole === "user" && (
+ <>測試完整的評分表單功能
+測試動態評分項目功能
+- 注意:新註冊用戶預設為一般用戶角色。如需其他角色權限,請聯繫管理員進行調整。 -
-驗證重設連結中...
++ 您的密碼已成功重設,3 秒後將自動跳轉到首頁 +
+ +請先登入才能訪問管理員頁面
- -您沒有訪問管理員頁面的權限
- -載入中...
+您沒有管理員權限訪問此頁面
+ {process.env.NODE_ENV === 'development' && ( +總應用數
-{totalApps}
+{apps.length}
已發布
-{stats.published}
+{apps.filter((a) => a.status === "published").length}
待審核
-{stats.pending}
+{apps.filter((a) => a.status === "pending").length}
尚無應用程式
-點擊右上角的「新增應用」按鈕來創建第一個應用程式
-{typeof app.creator === 'object' ? app.creator.name : app.creator}
-{typeof app.creator === 'object' ? app.creator.department : app.department}
+{app.creator}
+{app.department}
{selectedApp.name}
+{selectedApp.creator?.name || '未知'}
-{selectedApp.creator?.department || '未知'}
-{selectedApp.version || '1.0.0'}
-- {selectedApp.description} -
-- {selectedApp.createdAt ? new Date(selectedApp.createdAt).toLocaleString() : '未知'} -
-- {selectedApp.updatedAt ? new Date(selectedApp.updatedAt).toLocaleString() : '未知'} -
-瀏覽次數
-{selectedApp.viewsCount || 0}
-按讚數
-{selectedApp.likesCount || 0}
-評分
-{selectedApp.rating || 0}
-收藏數
-{selectedApp.favoritesCount || 0}
-{selectedApp.description}
創建者
+{selectedApp.creator}
+創建日期
+{selectedApp.createdAt}
+應用ID
+{selectedApp.id}
+所屬部門
+{selectedApp.department}
+應用連結
+{selectedApp.appUrl}
+- 團隊名稱:{selectedApp.team.name} -
-- 所屬部門:{selectedApp.team.department} -
- {selectedApp.team.contactEmail && ( -- 聯絡郵箱:{selectedApp.team.contactEmail} -
- )} +{selectedApp.views}
+總瀏覽量
- {selectedApp.filePath} -
-{selectedApp.likes}
+收藏數
{selectedApp.rating}
+平均評分
+{selectedApp.reviews}
+評價數量
+此功能將顯示應用的所有評價和管理選項
總用戶數
-{stats.total}
+{stats.totalUsers}
活躍用戶
-{stats.total}
+{stats.activeUsers}
管理員
-{stats.admin}
+{stats.adminCount}
開發者
-{stats.developer}
+{stats.developerCount}
@@ -633,11 +514,11 @@ export function UserManagement() {
一般用戶
-{stats.user}
+待註冊
+{stats.inactiveUsers}
今日新增
-{stats.today}
+本月新增
+{stats.newThisMonth}
應用
-{stats.totalApps}
-
- 評價
-{stats.totalReviews}
-沒有找到用戶
-嘗試調整搜尋條件或篩選器
-用戶尚未註冊,暫無活動記錄
- ) : activity.type === 'review' ? (
- {activity.description}
-{activity.timestamp}
-暫無活動記錄
+登入系統
+2024-01-20 16:45
+查看應用:智能對話助手
+2024-01-20 15:30
+- {selectedUser.status === "invited" ? 0 : (selectedUser.loginDays || 0)} + {selectedUser.status === "invited" ? 0 : 15}
登入天數
您最近體驗過的 AI 應用
-by {app.author}
-by {app.author}
+{app.lastUsed}
-{app.lastUsed}
+開始探索平台上的 AI 應用,您的使用記錄將顯示在這裡
+您在平台上的活動概覽
+您在平台上的活動概覽
+比上週增加 12%
++ {(isNaN(stats.totalUsage) ? 0 : stats.totalUsage) > 0 ? "累計使用" : "尚未使用任何應用"} +
本月累計
++ {(isNaN(stats.totalDuration) ? 0 : stats.totalDuration) > 0 ? "累計時長" : "尚未開始使用"} +
個人收藏
++ {(isNaN(stats.favoriteApps) ? 0 : stats.favoriteApps) > 0 ? "個人收藏" : "尚未收藏任何應用"} +
+ {(isNaN(stats.daysJoined) ? 0 : stats.daysJoined) > 0 ? "已加入平台" : "今天剛加入"} +
尚未有使用數據
+開始使用應用後,類別分布將顯示在這裡
請檢查您的電子郵件:
+重設連結已為以下電子郵件生成:
{email}
• 請檢查您的收件匣和垃圾郵件資料夾
-• 重設連結將在 24 小時後過期
-• 如果您沒有收到郵件,請點擊下方重新發送
++ 此連結將在 {new Date(expiresAt).toLocaleString('zh-TW')} 過期 +
+您的帳號已創建,現在可以登入使用。
+您的帳號已創建,請等待管理員審核。