O lance das rotas no front-end resolvi mais ou menos assim:
export const routes = [
**Outras rotas**
{ path: '/gerenciar-usuarios', component: load('GerenciarUsuarios'), name: 'gerenciarUsuarios', meta: { requireAuth: true, grantAll: false, grants: ['ADMINISTRADOR_SISTEMA'] } },
{ path: '/itens-cardapio', component: load('ItensCardapio'), name: 'itensCardapio', meta: { requireAuth: true, grantAll: false, grants: ['ADMINISTRADOR_ESTABELECIMENTO'] } },
{ path: '/painel-pedidos', component: load('PainelPedidos'), name: 'painelPedidos', meta: { requireAuth: true, grantAll: false, grants: ['ADMINISTRADOR_ESTABELECIMENTO', 'OPERADOR_ESTABELECIMENTO'] } },
{ path: '*', component: load('Error404'), name: 'error404', meta: { requireAuth: false } }
]
const router = new VueRouter({
routes,
mode: 'history'
});
router.beforeEach((to, from, next) => {
if (to.meta.requireAuth) {
const authToken = LocalStorage.get.item('auth-token');
const userAuth = LocalStorage.get.item('userAuth');
if ((authToken && to.meta.grantAll) || (authToken && to.meta.grants.includes(userAuth.perfil))) {
console.log('Grant all: ' + to.meta.grantAll);
console.log('Grants: ' + to.meta.grants);
next();
} else {
if (authToken && !to.meta.grants.includes(userAuth.perfil)) {
next({ name: 'error404' });
} else {
next({ name: 'login' });
}
}
} else {
next();
}
});
A parte dos menus resolvi com v-if pegando perfil do usuario pelo LocalStorage tbm.
Agora uma dúvida, toda requisição eu devo descriptografar o token no back-end e fazer uma consulta na base de dados para validar? Não tem outra maneira que não utilize tanto a base de dados e consiga resolver este problema que não seja armazenando em memória (map, por exemplo)?
Outra coisa é uma sugestão de framework de segurança, na primeira postagem mencionei o picketlink e o spring security. Qual dos dois é mais fácil de implementar ? Tem algum esquema em um desses de só anotar com a Enum e o proprio framework validar(tipo @Secured(PerfilUsuario.ADMIN)?