Как правильно разделять пользовательский интерфейс по ролям пользователей?
Доброго времени суток.
Как правильно сделать так, чтобы при логине, пользователю с одной ролью отображался один компонент, а пользователю с другой ролью другой компонент.
Использую vuex и vue router. На бэкэнде Laravel.
Ситуация вроде не сложная, но запутался. Прошу помочь.
Можно прям в корне компонентов проставить v-if и указывать значение в зависимости от роли у каждого компонента.
Ну а выводить оба, просто один самовыпилится в этот момент.
Или сделать компонент-обертку, которая будет подключать нужный через https://ru.vuejs.org/v2/guide/components.html#%D0%...
Или сделать два роута и перенаправлять на нужный при неправильной роли.
Очень много способов :)
Не подскажете, как в самом роутере определять роль пользователя? Вот тут:
router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
// этот путь требует авторизации, проверяем залогинен ли
// пользователь, и если нет, перенаправляем на страницу логина
if (!auth.loggedIn()) {
next({
path: '/login',
query: { redirect: to.fullPath }
})
} else {
next()
}
} else {
next() // всегда так или иначе нужно вызвать next()!
}
})
Т.е. передать роль пользователя и смотреть может ли он обратиться к данному роуту или нет.
iAlex195, ну можно в метаданных роута прописать роли, для которых роут доступен по аналогии с meta.requiresAuth (например при ограничении по ролям пихать массив с ролями) и расширить объект auth, чтобы он это проверял.
Dmitriyq, А как при обновлении компонента Вы не теряете данные о роли пользователя? Ведь при обновлении страницы vuex будет пустым и пользователя будет перебрасывать на next(false)
iAlex195, можно вынести в отдельный router.beforeEach
router.beforeEach((to, from, next) =>{
if (!store.getters['user/isLogged'] && to.path !== '/login'){
// попытаться восстановить по данным из локалстораджа/куков/пр.
store.dispatch('user/restoreAuth').then(() =>{
if (!store.getters['user/isLogged']) next('/login');
else next();
});
}
next();
});
router.beforeEach((to, from, next) =>{
// остальные проверки по ролям и пр.
});