Почему вы не обновляете данные магазина правильно после отправки из Vue Router? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть несколько маршрутов, защищенных в vue-router, это я делаю через свойство meta маршрутов в vue-router.

Когда я загружаю индексный маршрут, то есть все записи показывают мне кнопку редактирования, так как в этот момент у меня есть это разрешение, если я обновляю этого пользователя, я перехожу на другую панель с администратором и яудалить указанное разрешение.Теперь я иду к обычному пользователю и даю кнопку редактирования моей таблицы, я должен отправить меня на маршрут 403, поскольку у меня нет этого разрешения в данный момент, но его нет, только для следующей навигации по другому маршруту.Я обновляю разрешения.Как мне решить эту проблему?

router.beforeEach((to, from, next) => {
    store.dispatch('ME'); // get permissions before navigate route
    if (to.matched.some(record => record.meta.permission_name)) {
        // I check if the route permits, otherwise send to route 403
        if(!store.getters.containsPermission(to.meta.permission_name)){
            next({name : '403'})
        }
        else{
            next()
        }
    }
    else{
        next()
    }
})

Разрешения находятся в базе данных от бэкэнда. Я использую разрешения Laravel и Laravel, изменяя разрешения для этого пользователя от другого пользователя-администратора и выполняя store.dispatch('ME'); Iполучить новые разрешения, которые, как мне показалось, вызывая диспетчерскую службу перед оценкой мета, правильно дойдет до next({'403'});

Надеюсь, вы меня понимаете, если нет, не стесняйтесь комментировать.

1 Ответ

0 голосов
/ 03 июня 2019

Не ставьте разрешения в вашем магазине. Я или кто-то еще, как я, хитрый, могу просто вставить полные разрешения для вашего приложения, когда захочу. Вместо этого запрашивайте их через API перед каждым изменением маршрута.

router.beforeEach(async (to, from, next) => {
  try {
    await api.get('permissions', { params: permissions: to.matched.some((record) => record.meta.permission_name }})

    next()
  } catch (e) {
    next({ name: '403 })
  }
})

И просто обработайте это на стороне сервера.

...