/** * Authentication Middleware * 處理使用者認證和授權 */ /** * 檢查是否已登入 */ export function requireAuth(req, res, next) { if (req.session && req.session.userId) { return next(); } return res.status(401).json({ success: false, error: '未登入', message: '請先登入系統' }); } /** * 檢查是否為管理者 */ export function requireAdmin(req, res, next) { if (!req.session || !req.session.userId) { return res.status(401).json({ success: false, error: '未登入', message: '請先登入系統' }); } if (req.session.userRole !== 'admin' && req.session.userRole !== 'super_admin') { return res.status(403).json({ success: false, error: '權限不足', message: '需要管理者權限' }); } next(); } /** * 檢查是否為最高權限管理者 */ export function requireSuperAdmin(req, res, next) { if (!req.session || !req.session.userId) { return res.status(401).json({ success: false, error: '未登入', message: '請先登入系統' }); } if (req.session.userRole !== 'super_admin') { return res.status(403).json({ success: false, error: '權限不足', message: '需要最高權限' }); } next(); } /** * 檢查資源擁有權(使用者只能存取自己的資源) */ export function requireOwnership(resourceUserIdParam = 'userId') { return (req, res, next) => { const resourceUserId = parseInt(req.params[resourceUserIdParam]); const currentUserId = req.session.userId; const currentUserRole = req.session.userRole; // 管理者可以存取所有資源 if (currentUserRole === 'admin' || currentUserRole === 'super_admin') { return next(); } // 一般使用者只能存取自己的資源 if (resourceUserId !== currentUserId) { return res.status(403).json({ success: false, error: '權限不足', message: '無法存取他人的資源' }); } next(); }; } /** * 取得使用者資訊(可選的認證) */ export function optionalAuth(req, res, next) { // 即使未登入也允許繼續,但會設定 req.userId 為 null req.userId = req.session?.userId || null; req.userRole = req.session?.userRole || null; next(); }