Better role management
This commit is contained in:
parent
8522abdca0
commit
14115749a8
|
@ -1,4 +1,4 @@
|
||||||
import { addSeconds, differenceInSeconds } from 'date-fns'
|
import { addSeconds, differenceInSeconds, addHours } from 'date-fns'
|
||||||
import { ad } from '../lib/activeDirectory'
|
import { ad } from '../lib/activeDirectory'
|
||||||
import prisma from '../prisma'
|
import prisma from '../prisma'
|
||||||
import { Change, createClient } from 'ldapjs'
|
import { Change, createClient } from 'ldapjs'
|
||||||
|
@ -330,7 +330,6 @@ class User {
|
||||||
|
|
||||||
const jwtSecret = process.env.JWT_SECRET || 'a good secret'
|
const jwtSecret = process.env.JWT_SECRET || 'a good secret'
|
||||||
|
|
||||||
// TODO: Add date-fns to calculate expiration
|
|
||||||
const options = { expiresIn: process.env.JWT_EXPIRATION || '72h' }
|
const options = { expiresIn: process.env.JWT_EXPIRATION || '72h' }
|
||||||
|
|
||||||
const token = jwt.sign(payload, jwtSecret, options)
|
const token = jwt.sign(payload, jwtSecret, options)
|
||||||
|
@ -338,7 +337,8 @@ class User {
|
||||||
return {
|
return {
|
||||||
user,
|
user,
|
||||||
token,
|
token,
|
||||||
expiresIn: options.expiresIn
|
expiresIn: options.expiresIn,
|
||||||
|
expiresOn: addHours
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import { promiseWrapper as AD } from 'activedirectory2'
|
import { promiseWrapper as AD } from 'activedirectory2'
|
||||||
import config from './config'
|
import config from './config'
|
||||||
|
|
||||||
// TODO: Refactor to instantiate in context creation function
|
|
||||||
const ad = new AD(config)
|
const ad = new AD(config)
|
||||||
|
|
||||||
ad.checkBinding = async () => {
|
ad.checkBinding = async () => {
|
||||||
|
|
|
@ -138,7 +138,7 @@ export async function getLoggedUser() {
|
||||||
})
|
})
|
||||||
return result.data.me
|
return result.data.me
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log('Erro ao recuperar informações do usuário: ', e)
|
console.error('Erro ao recuperar informações do usuário: ', e)
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,17 +6,20 @@ import { getLoggedUser } from '../plugins/vue-apollo'
|
||||||
|
|
||||||
Vue.use(VueRouter)
|
Vue.use(VueRouter)
|
||||||
|
|
||||||
|
/*
|
||||||
|
Roles matching:
|
||||||
|
If a route has no meta.roles property it's considered public
|
||||||
|
If a route has a empty meta.roles array, only auth is required
|
||||||
|
And if meta.roles has items, user.roles should satisfy it.
|
||||||
|
*/
|
||||||
|
|
||||||
const routes = [
|
const routes = [
|
||||||
{
|
{
|
||||||
path: '/',
|
path: '/',
|
||||||
name: 'home',
|
name: 'home',
|
||||||
component: Home,
|
component: Home,
|
||||||
meta: {
|
meta: {
|
||||||
noAuth: false,
|
roles: [],
|
||||||
superAdmin: false,
|
|
||||||
tokenCreator: false,
|
|
||||||
servant: false,
|
|
||||||
student: false,
|
|
||||||
title: null
|
title: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -24,7 +27,6 @@ const routes = [
|
||||||
path: '/about',
|
path: '/about',
|
||||||
name: 'about',
|
name: 'about',
|
||||||
meta: {
|
meta: {
|
||||||
noAuth: true,
|
|
||||||
title: 'Sobre'
|
title: 'Sobre'
|
||||||
},
|
},
|
||||||
// route level code-splitting
|
// route level code-splitting
|
||||||
|
@ -37,7 +39,6 @@ const routes = [
|
||||||
path: '/login',
|
path: '/login',
|
||||||
name: 'login',
|
name: 'login',
|
||||||
meta: {
|
meta: {
|
||||||
noAuth: true,
|
|
||||||
layout: 'Simple',
|
layout: 'Simple',
|
||||||
title: 'Login'
|
title: 'Login'
|
||||||
},
|
},
|
||||||
|
@ -48,7 +49,8 @@ const routes = [
|
||||||
path: '/update-password',
|
path: '/update-password',
|
||||||
name: 'update-password',
|
name: 'update-password',
|
||||||
meta: {
|
meta: {
|
||||||
title: 'Atualizar minha senha'
|
title: 'Atualizar minha senha',
|
||||||
|
roles: []
|
||||||
},
|
},
|
||||||
component: () =>
|
component: () =>
|
||||||
import(
|
import(
|
||||||
|
@ -60,7 +62,7 @@ const routes = [
|
||||||
name: 'user-info',
|
name: 'user-info',
|
||||||
meta: {
|
meta: {
|
||||||
title: 'Inspecionar usuário',
|
title: 'Inspecionar usuário',
|
||||||
superAdmin: true
|
roles: ['superAdmin']
|
||||||
},
|
},
|
||||||
component: () =>
|
component: () =>
|
||||||
import(/* webpackChunkName: "user-info" */ '../views/UserInfo.vue')
|
import(/* webpackChunkName: "user-info" */ '../views/UserInfo.vue')
|
||||||
|
@ -70,7 +72,8 @@ const routes = [
|
||||||
name: 'replace-password',
|
name: 'replace-password',
|
||||||
meta: {
|
meta: {
|
||||||
title: 'Redefinir uma senha',
|
title: 'Redefinir uma senha',
|
||||||
superAdmin: true
|
|
||||||
|
roles: ['superAdmin']
|
||||||
},
|
},
|
||||||
component: () =>
|
component: () =>
|
||||||
import(
|
import(
|
||||||
|
@ -81,7 +84,8 @@ const routes = [
|
||||||
path: '/my-devices',
|
path: '/my-devices',
|
||||||
name: 'my-devices',
|
name: 'my-devices',
|
||||||
meta: {
|
meta: {
|
||||||
title: 'Meus dispositivos'
|
title: 'Meus dispositivos',
|
||||||
|
roles: []
|
||||||
},
|
},
|
||||||
component: () =>
|
component: () =>
|
||||||
import(/* webpackChunkName: "my-devices" */ '../views/MyDevices.vue')
|
import(/* webpackChunkName: "my-devices" */ '../views/MyDevices.vue')
|
||||||
|
@ -90,8 +94,8 @@ const routes = [
|
||||||
path: '/create-token',
|
path: '/create-token',
|
||||||
name: 'create-token',
|
name: 'create-token',
|
||||||
meta: {
|
meta: {
|
||||||
tokenCreator: true,
|
title: 'Criar um token',
|
||||||
title: 'Criar um token'
|
roles: ['tokenCreator']
|
||||||
},
|
},
|
||||||
component: () =>
|
component: () =>
|
||||||
import(/* webpackChunkName: "create-token" */ '../views/CreateToken.vue')
|
import(/* webpackChunkName: "create-token" */ '../views/CreateToken.vue')
|
||||||
|
@ -100,7 +104,6 @@ const routes = [
|
||||||
path: '/use-token',
|
path: '/use-token',
|
||||||
name: 'use-token',
|
name: 'use-token',
|
||||||
meta: {
|
meta: {
|
||||||
noAuth: true,
|
|
||||||
layout: 'Simple',
|
layout: 'Simple',
|
||||||
title: 'Token'
|
title: 'Token'
|
||||||
},
|
},
|
||||||
|
@ -114,7 +117,7 @@ const routes = [
|
||||||
meta: {
|
meta: {
|
||||||
layout: 'Simple',
|
layout: 'Simple',
|
||||||
title: 'Imprimir token',
|
title: 'Imprimir token',
|
||||||
tokenCreator: true
|
roles: ['tokenCreator']
|
||||||
},
|
},
|
||||||
component: () =>
|
component: () =>
|
||||||
import(/* webpackChunkName: "print-token" */ '../views/PrintToken.vue')
|
import(/* webpackChunkName: "print-token" */ '../views/PrintToken.vue')
|
||||||
|
@ -125,7 +128,7 @@ const routes = [
|
||||||
name: 'user-id',
|
name: 'user-id',
|
||||||
meta: {
|
meta: {
|
||||||
title: 'Crachá',
|
title: 'Crachá',
|
||||||
servant: true
|
roles: ['servant']
|
||||||
},
|
},
|
||||||
component: () =>
|
component: () =>
|
||||||
import(/* webpackChunkName: "user-id" */ '../views/UserId.vue')
|
import(/* webpackChunkName: "user-id" */ '../views/UserId.vue')
|
||||||
|
@ -147,7 +150,7 @@ const routes = [
|
||||||
name: 'user-presence',
|
name: 'user-presence',
|
||||||
meta: {
|
meta: {
|
||||||
title: 'No campus agora',
|
title: 'No campus agora',
|
||||||
watcher: true
|
roles: ['watcher']
|
||||||
},
|
},
|
||||||
component: () =>
|
component: () =>
|
||||||
import(
|
import(
|
||||||
|
@ -160,7 +163,7 @@ const routes = [
|
||||||
name: 'wifi-devices',
|
name: 'wifi-devices',
|
||||||
meta: {
|
meta: {
|
||||||
title: 'Dispositivos Wi-Fi',
|
title: 'Dispositivos Wi-Fi',
|
||||||
superAdmin: true
|
roles: ['superAdmin']
|
||||||
},
|
},
|
||||||
component: () =>
|
component: () =>
|
||||||
import(/* webpackChunkName: "wifi-devices" */ '../views/WifiDevices.vue')
|
import(/* webpackChunkName: "wifi-devices" */ '../views/WifiDevices.vue')
|
||||||
|
@ -171,7 +174,7 @@ const routes = [
|
||||||
name: 'wifi-users',
|
name: 'wifi-users',
|
||||||
meta: {
|
meta: {
|
||||||
title: 'Usuários Wi-Fi',
|
title: 'Usuários Wi-Fi',
|
||||||
superAdmin: true
|
roles: ['superAdmin']
|
||||||
},
|
},
|
||||||
component: () =>
|
component: () =>
|
||||||
import(/* webpackChunkName: "wifi-users" */ '../views/WifiUsers.vue')
|
import(/* webpackChunkName: "wifi-users" */ '../views/WifiUsers.vue')
|
||||||
|
@ -182,7 +185,7 @@ const routes = [
|
||||||
name: 'system-administration',
|
name: 'system-administration',
|
||||||
meta: {
|
meta: {
|
||||||
title: 'Administração do sistema',
|
title: 'Administração do sistema',
|
||||||
superAdmin: true
|
roles: ['superAdmin']
|
||||||
},
|
},
|
||||||
component: () =>
|
component: () =>
|
||||||
import(
|
import(
|
||||||
|
@ -212,46 +215,31 @@ function updateTitle(title) {
|
||||||
|
|
||||||
router.beforeEach(async (to, from, next) => {
|
router.beforeEach(async (to, from, next) => {
|
||||||
updateTitle(to.meta.title)
|
updateTitle(to.meta.title)
|
||||||
const loggedUser = await getLoggedUser()
|
|
||||||
|
|
||||||
if (loggedUser && to.matched.some(record => record.name === 'login'))
|
const auth = await getLoggedUser()
|
||||||
next({ name: 'home' })
|
|
||||||
else {
|
|
||||||
if (to.matched.some(record => record.meta.noAuth)) next()
|
|
||||||
else {
|
|
||||||
if (!loggedUser)
|
|
||||||
next({
|
|
||||||
name: 'login',
|
|
||||||
params: {
|
|
||||||
next: to.fullPath,
|
|
||||||
message: 'Você precisa fazer login para entrar nesta página.'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
else {
|
|
||||||
//TODO: improve user authorization
|
|
||||||
const doNotHaveAuthorization =
|
|
||||||
(to.matched.some(record => record.meta.superAdmin) &&
|
|
||||||
!loggedUser.isSuperAdmin) ||
|
|
||||||
(to.matched.some(record => record.meta.tokenCreator) &&
|
|
||||||
!loggedUser.isTokenCreator) ||
|
|
||||||
(to.matched.some(record => record.meta.servant) &&
|
|
||||||
!loggedUser.isServant) ||
|
|
||||||
(to.matched.some(record => record.meta.student) &&
|
|
||||||
!loggedUser.isStudent) ||
|
|
||||||
(to.matched.some(record => record.meta.watcher) &&
|
|
||||||
!loggedUser.isWatcher)
|
|
||||||
|
|
||||||
if (doNotHaveAuthorization)
|
if (auth && to.name === 'login') next({ name: 'home' })
|
||||||
next({
|
else if (!('roles' in to.meta)) next()
|
||||||
name: 'home',
|
else if (!auth)
|
||||||
params: {
|
next({
|
||||||
message: 'Você não tem permissão para entrar nessa página.'
|
name: 'login',
|
||||||
}
|
params: {
|
||||||
})
|
next: to.fullPath,
|
||||||
else next()
|
message: 'Você precisa fazer login para entrar nesta página.'
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
}
|
else if (
|
||||||
|
!to.meta.roles.length ||
|
||||||
|
to.meta.roles.some(role => auth.roles.includes(role))
|
||||||
|
)
|
||||||
|
next()
|
||||||
|
else
|
||||||
|
next({
|
||||||
|
name: 'home',
|
||||||
|
params: {
|
||||||
|
message: 'Você não tem permissão para entrar na página solicitada.'
|
||||||
|
}
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
export default router
|
export default router
|
||||||
|
|
Loading…
Reference in New Issue
Block a user