| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- // URL → 메뉴 권한 id 매핑 (admin.vue menuItems의 id와 동일)
- const URL_PERMISSION_MAP = [
- { prefix: '/site-manager/dashboard', id: 'dashboard' },
- { prefix: '/site-manager/admin', id: 'admin' },
- { prefix: '/site-manager/field', id: 'field' },
- { prefix: '/site-manager/area', id: 'field' },
- { prefix: '/site-manager/onboard', id: 'fishing' },
- { prefix: '/site-manager/fishing', id: 'fishing' },
- { prefix: '/site-manager/challenge', id: 'challenge' },
- { prefix: '/site-manager/quest', id: 'quest' },
- { prefix: '/site-manager/item', id: 'item' },
- { prefix: '/site-manager/species_challenge', id: 'species' },
- { prefix: '/site-manager/species_quest', id: 'species' },
- { prefix: '/site-manager/species', id: 'species' },
- { prefix: '/site-manager/user', id: 'user' },
- ]
- // URL에서 필요한 권한 id를 찾는다 (없으면 null = 인증만 통과하면 OK)
- const getRequiredPermission = (path) => {
- for (const m of URL_PERMISSION_MAP) {
- if (path.startsWith(m.prefix)) return m.id
- }
- return null
- }
- // 현재 로그인된 admin이 해당 권한을 가지고 있는지
- const hasPermission = (user, menuId) => {
- if (menuId === 'dashboard') return true
- if (!user) return false
- if (user.role === 'super_admin') return true
- if (user.permissions === 'all') return true
- return Array.isArray(user.permissions) && user.permissions.includes(menuId)
- }
- export default defineNuxtRouteMiddleware((to) => {
- // SSR에서는 middleware 실행 안 함 (클라이언트에서만)
- if (import.meta.server) return
- // Admin 페이지가 아니면 패스
- if (!to.path.startsWith('/site-manager')) return
- const token = localStorage.getItem('admin_token')
- // 로그인 페이지는 예외 처리
- if (to.path === '/site-manager' || to.path === '/site-manager/') {
- if (token) return navigateTo('/site-manager/dashboard')
- return
- }
- // Admin 페이지 접근 시 토큰 체크
- if (!token) {
- return navigateTo('/site-manager')
- }
- // 권한 체크
- let user = null
- try {
- user = JSON.parse(localStorage.getItem('admin_user') || 'null')
- } catch {
- user = null
- }
- const requiredId = getRequiredPermission(to.path)
- if (requiredId && !hasPermission(user, requiredId)) {
- console.warn('[Auth] 권한 없음 — dashboard로 이동:', to.path, '필요 권한:', requiredId)
- return navigateTo('/site-manager/dashboard')
- }
- })
|