From 55aa66a0c892c2bbdb355e9fb4dfbed17ce3b8c3 Mon Sep 17 00:00:00 2001 From: Yonas Adiel <yonazadielwiguna@gmail.com> Date: Sun, 21 Apr 2019 11:45:23 +0700 Subject: [PATCH] add guard --- viz-dev-frontend/src/guard.js | 67 ++++++++++++++++++++++++++++ viz-dev-frontend/src/modules/auth.js | 3 ++ viz-dev-frontend/src/router.js | 15 +++---- 3 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 viz-dev-frontend/src/guard.js diff --git a/viz-dev-frontend/src/guard.js b/viz-dev-frontend/src/guard.js new file mode 100644 index 0000000..92f6087 --- /dev/null +++ b/viz-dev-frontend/src/guard.js @@ -0,0 +1,67 @@ +import store from './store'; +import api from './api'; + +async function getCurrentSession() { + try { + const response = await api.get('/me/', { ignoreUnauthorizedError: true }); + return response.data; + } catch (err) { + return null; + } +} + +export async function requireLogin(_, from, next) { + const redirectTo = { name: 'Home', replace: true }; + + if (store.getters['auth/isLoggedIn']) { + next(); + return; + } + + const user = await getCurrentSession(); + if (user) { + store.commit('auth/setUser', user); + next(); + return; + } + + next(redirectTo); +} + +export async function requireAdmin(_, from, next) { + const redirectTo = { name: 'Home', replace: true }; + + if (store.getters['auth/isAdmin']) { + next(); + return; + } + + const user = await getCurrentSession(); + if (user) { + if (user.role === 'admin') { + store.commit('auth/setUser', user); + next(); + return; + } + } + + next(redirectTo); +} + +export async function requireGuest(_, from, next) { + const redirectTo = { name: 'Home', replace: true }; + + if (store.getters['auth/isLoggedIn']) { + next(redirectTo); + return; + } + + const user = await getCurrentSession(); + if (user) { + store.commit('auth/setUser', user); + next(redirectTo); + return; + } + + next(); +} diff --git a/viz-dev-frontend/src/modules/auth.js b/viz-dev-frontend/src/modules/auth.js index 805c6b5..7b439da 100644 --- a/viz-dev-frontend/src/modules/auth.js +++ b/viz-dev-frontend/src/modules/auth.js @@ -11,6 +11,9 @@ export default { isLoggedIn(state) { return !!state.user; }, + isAdmin(state) { + return !!state.user && (state.user.role === 'admin'); + }, }, mutations: { /* eslint-disable no-param-reassign */ diff --git a/viz-dev-frontend/src/router.js b/viz-dev-frontend/src/router.js index 3aebefb..a5de307 100644 --- a/viz-dev-frontend/src/router.js +++ b/viz-dev-frontend/src/router.js @@ -1,5 +1,6 @@ import Vue from 'vue'; import Router from 'vue-router'; +import { requireAdmin, requireGuest, requireLogin } from './guard'; import Home from './views/Home.vue'; import ManageAccount from './views/ManageAccount.vue'; import Login from './views/Login.vue'; @@ -14,36 +15,32 @@ export default new Router({ routes: [ { path: '/', - name: 'home', + name: 'Home', component: Home, }, - { - path: '/about', - name: 'about', - // route level code-splitting - // this generates a separate chunk (about.[hash].js) for this route - // which is lazy-loaded when the route is visited. - component: () => import(/* webpackChunkName: "about" */ './views/About.vue'), - }, { path: '/manage', name: 'ManageAccount', component: ManageAccount, + beforeEnter: requireAdmin, }, { path: '/login', name: 'Login', component: Login, + beforeEnter: requireGuest, }, { path: '/edit', name: 'Edit', component: Edit, + beforeEnter: requireLogin, }, { path: '/edit_data', name: 'Edit_Data', component: EditData, + beforeEnter: requireLogin, }, ], }); -- GitLab