auth.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // URL → 메뉴 권한 id 매핑 (admin.vue menuItems의 id와 동일)
  2. const URL_PERMISSION_MAP = [
  3. { prefix: '/site-manager/dashboard', id: 'dashboard' },
  4. { prefix: '/site-manager/admin', id: 'admin' },
  5. { prefix: '/site-manager/field', id: 'field' },
  6. { prefix: '/site-manager/area', id: 'field' },
  7. { prefix: '/site-manager/onboard', id: 'fishing' },
  8. { prefix: '/site-manager/fishing', id: 'fishing' },
  9. { prefix: '/site-manager/challenge', id: 'challenge' },
  10. { prefix: '/site-manager/quest', id: 'quest' },
  11. { prefix: '/site-manager/item', id: 'item' },
  12. { prefix: '/site-manager/species_challenge', id: 'species' },
  13. { prefix: '/site-manager/species_quest', id: 'species' },
  14. { prefix: '/site-manager/species', id: 'species' },
  15. { prefix: '/site-manager/user', id: 'user' },
  16. ]
  17. // URL에서 필요한 권한 id를 찾는다 (없으면 null = 인증만 통과하면 OK)
  18. const getRequiredPermission = (path) => {
  19. for (const m of URL_PERMISSION_MAP) {
  20. if (path.startsWith(m.prefix)) return m.id
  21. }
  22. return null
  23. }
  24. // 현재 로그인된 admin이 해당 권한을 가지고 있는지
  25. const hasPermission = (user, menuId) => {
  26. if (menuId === 'dashboard') return true
  27. if (!user) return false
  28. if (user.role === 'super_admin') return true
  29. if (user.permissions === 'all') return true
  30. return Array.isArray(user.permissions) && user.permissions.includes(menuId)
  31. }
  32. export default defineNuxtRouteMiddleware((to) => {
  33. // SSR에서는 middleware 실행 안 함 (클라이언트에서만)
  34. if (import.meta.server) return
  35. // Admin 페이지가 아니면 패스
  36. if (!to.path.startsWith('/site-manager')) return
  37. const token = localStorage.getItem('admin_token')
  38. // 로그인 페이지는 예외 처리
  39. if (to.path === '/site-manager' || to.path === '/site-manager/') {
  40. if (token) return navigateTo('/site-manager/dashboard')
  41. return
  42. }
  43. // Admin 페이지 접근 시 토큰 체크
  44. if (!token) {
  45. return navigateTo('/site-manager')
  46. }
  47. // 권한 체크
  48. let user = null
  49. try {
  50. user = JSON.parse(localStorage.getItem('admin_user') || 'null')
  51. } catch {
  52. user = null
  53. }
  54. const requiredId = getRequiredPermission(to.path)
  55. if (requiredId && !hasPermission(user, requiredId)) {
  56. console.warn('[Auth] 권한 없음 — dashboard로 이동:', to.path, '필요 권한:', requiredId)
  57. return navigateTo('/site-manager/dashboard')
  58. }
  59. })