Таким образом, вы хотите запретить вошедшим в систему пользователям доступ к вашему маршруту входа, но вы также хотите, чтобы не зарегистрированные пользователи не заходили на определенные страницы в вашем приложении Vue. Довольно стандартный вариант использования. Вот как я это реализовал:
Во-первых, у моих маршрутов есть метатеги requiresAuth
и forVisitors
. Если пользователь вошел в систему и попытался перейти по маршруту forVisitors, я возвращаю его на домашнюю страницу (routeObject.path = '/'
в моем примере ниже). Если пользователь не вошел в систему и пытается найти путь requiresAuth
, я выгоняю его в / login. Я обнаружил, что этот подход довольно гибок для построения маршрута.
Мой маршрутизатор должен знать, что входит в систему вошедшего в систему пользователя. Используя модуль авторизации Firebase, я могу подписаться на onAuthStateChanged
и выяснить, вошел ли пользователь в систему с первого выпуска.
Обратите внимание, я сохраняю текущего пользователя в хранилище VueX (store.state.userModule.user
), вы можете игнорировать этот бит, если вы этого не сделаете. Кроме того, я храню объект Firebase Auth в своем магазине как store.state.userModule.auth
, поэтому, когда вы видите это, он аналогичен Firebase auth.
Кроме того, вы можете найти более подробную информацию о том, почему я заключаю мою подписку onAuthStateChanged в Обещание здесь: Получение 'Uncaught' после обнаружения ошибки в firebase.auth () с asyn c
const router = new Router({
/* example of forVisitors path */
{
path: '/Login',
name: 'Login',
component: Login,
meta: {
requiresAuth: false,
forVisitors: true
}
},
/* example of requiresAuth path */
{
path: '/Submit/:mode?/:primary?/:secondary?',
name: 'Submit',
component: Submit,
props: true,
meta: {
requiresAuth: true
}
}
});
router.beforeEach(async (to, from, next) => {
/* Check for a user in my store, or fallback to Firebase auth() user */
let currentUser =
store.state.userModule.user ||
(await new Promise((resolve) => {
store.state.userModule.auth().onAuthStateChanged(user => {
resolve(user);
});
}));
const requiresAuth = to.meta.requiresAuth;
const forVisitors = to.meta.forVisitors;
const routeObject = {};
if (forVisitors && currentUser) {
routeObject.path = '/';
} else if (requiresAuth && !currentUser) {
routeObject.path = '/login';
}
next(routeObject);
});