Как осуществить перенаправление при изменении значения переменной в vue-router?

Как можно настроить изменение значения прав доступа к странице, чтобы в случае отсутствия прав у пользователя происходил редирект на главную страницу? Есть ли возможность реализовать это через настройки путей, или лучший вариант — отслеживать права доступа в компоненте и выполнять редирект там?
  • 11 февраля 2025 г. 4:34
Ответы на вопрос 2
Для управления перенаправлением на основе прав доступа в Vue с использованием Vue Router, у вас есть несколько вариантов.

### Рекомендуемый подход с использованием навигационных хуков:

1. **Используйте навигационные охранники (navigation guards)** в `vue-router`, чтобы проверять права доступа перед тем, как пользователь попадет на защищенные маршруты. Можно сделать это в `beforeEnter`, или глобально через `router.beforeEach`.

Пример использования глобального охранника:

```javascript
import Vue from 'vue';
import Router from 'vue-router';

Vue.use(Router);

const router = new Router({
  routes: [
    {
      path: '/protected',
      component: () => import('./components/Protected.vue'), // Компонент защищенной страницы
      meta: { requiresAuth: true }, // Используем мета-поле для проверки прав доступа
    },
    {
      path: '/',
      component: () => import('./components/Home.vue'), // Главная страница
    },
    // Другие маршруты
  ],
});

router.beforeEach((to, from, next) => {
  const isAuthenticated = false; // Здесь должна быть логика проверки auth (например, из Vuex или другого состояния)

  if (to.matched.some(record => record.meta.requiresAuth) && !isAuthenticated) {
    next('/'); // Перенаправление на главную страницу, если пользователь не авторизован
  } else {
    next(); // продолжить навигацию
  }
});

export default router;
```

### Проверка прав доступа в компонентах:

Хотя управление правами доступа через навигационные охранники более чистый и централизованный подход, вы можете также выполнять проверку прав внутри компонентов. Однако это будет менее эффективным, так как пользователь уже зайдет на страницу, и это потребует дополнительной логики в каждом компоненте.

Пример проверки в компоненте:

```javascript
export default {
  data() {
    return {
      isAuthenticated: false, // Здесь должна быть логика проверки auth
    };
  },
  created() {
    if (!this.isAuthenticated) {
      this.$router.push('/'); // Перенаправление на главную, если нет прав доступа
    }
  },
};
```

### Заключение:

Наиболее распространенной практикой является использование навигационных охранников для проверки прав доступа, так как она позволяет централизованно управлять маршрутизацией в одном месте. Это делает ваш код более чистым и поддерживаемым.
Тут либо тебе поможет Watch, либо guard в РОутере 

1-
<script setup>
import { useRouter } from 'vue-router';
import { computed, watch } from 'vue';
import { useAuthStore } from '@/stores/auth'; // Пример с Pinia

const router = useRouter();
const authStore = useAuthStore();
const userRole = computed(() => authStore.role);

watch(userRole, (newRole) => {
    if (newRole !== 'admin') {
        router.push('/'); 
    }
});
</script>


Тут проверка, перед переходом

router.beforeEach((to, from, next) => {
    const hasAccess = checkUserAccess(to); 
    if (!hasAccess) {
        next('/'); 
    } else {
        next();
    }
});
Похожие вопросы