#vue.js #vuejs2 #vuejs3
Вопрос:
Это работает для меня, если пользователь не вошел в систему, однако else if
это вообще не сработает, даже если путь маршрута «/login» и main.authState верен. Как мне это правильно настроить?
router.beforeEach((to, from, next) => {
const main = useAuthStore(router.pinia);
if (to.matched.some((record) => record.meta.authRequired)) {
if (!main.authState) {
return next("/login");
}
} else if(to.matched.some((record) => !record.meta.authRequired)) {
if (to.path == "/login" amp;amp; main.authState == true) {
alert(to.path) //"/login"
alert(typeof(main.authState)) //"boolean"
return next();
}
}
next();
});
async signOut() {
await auth.logout();
await localStorage.removeItem("authenticated");
await router.replace({ name: "Login" });
},
Ответ №1:
Если аутентификация не требуется для какого-либо маршрута, вы не должны проверять наличие authState
. Если я неправильно понял, объясните.
router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.authRequired)) {
const { authState } = useAuthStore(router.pinia);
// Ensure what authState is true to proceed to next() route
authState
? next()
: next('/login');
} else {
next();
}
});
Комментарии:
1. Тем не менее, после того, как значение authState равно true, и я посещаю страницу /входа в систему, она не перенаправляется на панель
2. Для входа в мою веб-панель требуется авторизация. @Radeanu
Ответ №2:
Вы можете использовать параметр URL-запроса для хранения целевого объекта перенаправления, к которому вы затем получаете доступ из своего Login.vue
компонента, и можете установить значение по умолчанию для перенаправления, когда пользователь обращается к /login
маршруту как аутентифицированный пользователь без предопределенного перенаправления.
router.beforeResolve(async (to, from, next) => {
if (to.matched.some((record) => record.meta.authRequired)) {
const lastMathcedRoute = to.matched[to.matched.length - 1].path || "/";
// "/" is just a fallback route
const main = useAuthStore(router.pinia);
const isAuthenticated = main.authState;
if (!isAuthenticated ) {
next({ path: "/login", query: { redirect: lastMathcedRoute } });
} else {
next();
}
} else {
next();
}
});
А затем в вашем компоненте входа в систему вы просто получаете доступ redirect
к параметру запроса, если пользователь уже прошел проверку подлинности или когда его состояние аутентификации меняется. В принципе, вам нужно каким-то образом получать уведомления или следить за состоянием аутентификации и соответствующим образом перенаправлять пользователя. Таким образом, вам нужно authState
быть реф или реактивным объектом, за которым вы можете наблюдать.
// Login.vue
import { useRouter } from "vue-router";
setup() {
const router = useRouter();
const { authState } = useAuthStore(router.pinia);
watch(authState, () => {
if (authState) {
const redirectLocation = route.query?.redirect?.toString() || '/pannel';
// here '/panel' is the default redirect
return router.push(redirectLocation);
}
}, { immediate: true } )
}
ПРОФЕССИОНАЛЬНЫЙ совет: обратите { immediate: true }
внимание , это делает так , что часы немедленно срабатывают с начальным значением authState
, вместо того, чтобы срабатывать только тогда, когда оно меняется. Это полезно в том случае, если состояние AUTH уже является истинным и оно не изменяется.
Вы можете использовать другие механизмы вместо a watcher
, но в принципе решение то же самое.
Комментарии:
1. всякий раз, когда я выхожу из своей страницы, URL-адрес запускается бесконечное количество раз. Вы знаете, почему это может произойти?
2. Ну, я думаю, что не следует направлять пользователей в /войти после того, как они выйдут из системы. Вместо этого вы должны направить их домой (‘/’), и всякий раз, когда они нажимают ссылку, которая направляет их на
authRequired
маршрут , они автоматически будут перенаправлены на /войтиquery: { redirect: lastMathcedRoute } }
. Вы пробовали это сделать?3. Я действительно не могу сказать, что происходит, не имея дополнительной информации.