feat(router): prevent redirection from public landing pages on session expiration

This commit is contained in:
Torsten Schulz (local)
2026-08-28 13:37:01 +02:00
parent db485b7acf
commit 2515354386
3 changed files with 11 additions and 3 deletions

View File

@@ -43,6 +43,12 @@ const router = createRouter({
}); });
router.beforeEach(async (to, from, next) => { router.beforeEach(async (to, from, next) => {
// These are public entry pages. They must never be redirected because a
// persisted login has expired while the application is starting up.
if (to.meta?.publicLanding) {
return next();
}
if (to.matched.some(record => record.meta.requiresAuth)) { if (to.matched.some(record => record.meta.requiresAuth)) {
if (!store.getters.isLoggedIn) { if (!store.getters.isLoggedIn) {
return next('/'); return next('/');

View File

@@ -278,13 +278,13 @@ const store = createStore({
} }
await dispatch('loadMenu'); await dispatch('loadMenu');
}, },
logout({ commit }) { logout({ commit }, { redirectToHome = true } = {}) {
commit('clearSocket'); commit('clearSocket');
commit('clearDaemonSocket'); commit('clearDaemonSocket');
commit('dologout'); commit('dologout');
// Öffentliche SEO-Landingpages müssen auch dann an ihrer URL bleiben, // Öffentliche SEO-Landingpages müssen auch dann an ihrer URL bleiben,
// wenn eine gespeicherte Sitzung abgelaufen ist und per 401 zurückgesetzt wird. // wenn eine gespeicherte Sitzung abgelaufen ist und per 401 zurückgesetzt wird.
if (!router.currentRoute.value.meta?.publicLanding) { if (redirectToHome && !router.currentRoute.value.meta?.publicLanding) {
router.push('/'); router.push('/');
} }
}, },

View File

@@ -32,7 +32,9 @@ apiClient.interceptors.response.use(response => {
return response; return response;
}, error => { }, error => {
if (error.response && error.response.status === 401) { if (error.response && error.response.status === 401) {
store.dispatch('logout'); // A failed background request may clear a stale browser session, but
// it must not replace the visitor's current public landing URL.
store.dispatch('logout', { redirectToHome: false });
} }
return Promise.reject(error); return Promise.reject(error);
}); });